我需要从表中选择具有已过去的完整ISO周内的日期时间的行。该表是每日交易表,我使用该表来汇总ISO周的数字。如果我今天汇总该表,则本周的汇总将仅基于本周的交易数据,该数据尚未结束。因此,截至撰写时,当前年和周为2019-19。我想减去一个星期,以便仅检索具有年份和星期2019-18或更早的行。
我正在使用Microsoft SQL Server,因此缺少MySQL函数YEARWEEK,我相信它将使此操作变得更加容易。本质上,我正在尝试做我相信SELECT * FROM TableA WHERE YEARWEEK(TransactionDateTime) <= YEARWEEK(DATEADD(week, -1, MAX(TransactionDateTime)))
会做的事情。
答案 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;