选择具有完整ISO周已过的日期时间的行

时间:2019-05-10 12:25:29

标签: sql tsql date datetime

我需要从表中选择具有已过去的完整ISO周内的日期时间的行。该表是每日交易表,我使用该表来汇总ISO周的数字。如果我今天汇总该表,则本周的汇总将仅基于本周的交易数据,该数据尚未结束。因此,截至撰写时,当前年和周为2019-19。我想减去一个星期,以便仅检索具有年份和星期2019-18或更早的行。

我正在使用Microsoft SQL Server,因此缺少MySQL函数YEARWEEK,我相信它将使此操作变得更加容易。本质上,我正在尝试做我相信SELECT * FROM TableA WHERE YEARWEEK(TransactionDateTime) <= YEARWEEK(DATEADD(week, -1, MAX(TransactionDateTime)))会做的事情。

2 个答案:

答案 0 :(得分:0)

试试这个-

SELECT * FROM TableA 
WHERE YEAR(TransactionDateTime) = 2019
AND  DATEPART(WEEK,TransactionDateTime) = DATEPART(WEEK,GETDATE()) - 1

答案 1 :(得分:0)

以下代码演示了如何为两个月的日期窗口确定ISO周的开始日期(始终为星期一)。从那里开始,只需减去一个星期即可获得上一个ISO周的开始。

with
  Dates as (
    -- Sample dates from the start of the current month ...
    select Cast( DateAdd( day, 1 - Day( GetDate() ), GetDate() ) as Date ) as TheDate
    union all
    -- ... through two full months.
    select DateAdd( day, 1, TheDate )
      from Dates
      where TheDate < Cast( DateAdd( month, 2, DateAdd( day, 1 - Day( GetDate() ), GetDate() ) ) as Date )
    ),
  DatesWithISOWeeks as (
    select TheDate, DatePart( iso_week, TheDate ) as ISOWeek,
      -- Calculate the Monday on which the ISO week started regardless of  @@DateFirst   or language settings.
      DateAdd( day, -( ( @@DateFirst + DatePart( weekday, TheDate ) - 2 ) % 7 ), TheDate ) as StartOfISOWeek
      from Dates )
  -- Output the results.
  select TheDate, ISOWeek, StartOfISOWeek,
    DateAdd( week, -1, StartOfISOWeek ) as StartOfPriorISOWeek
    from DatesWithISOWeeks;

where与边界进行比较的TransactionDateTime子句是可以保存的,即它可以受益于TransactionDateTime上的索引:

where StartOfPriorISOWeek <= TransactionDateTime and TransactionDateTime < StartOfISOWeek

请注意,比较是<=<,因此只包括一周而不是八天。由于年份包含在日期中,因此无需其他比较。

还请注意,计算与@@DateFirst的设置和当前语言无关:

select Cast( DateAdd( day, -( ( @@DateFirst + DatePart( weekday, GetDate() ) - 2 ) % 7 ), Getdate() ) as Date ) as StartOfISOWeek;