我想将当前一周(1到52)的数据与两周前的数据进行比较。我需要确保在越过新年边界时,比较仍然有效。我有一个工作谓词,如下:
WHERE ( DATEPART(ww,MA.DateOpen) + 1 ) % 52 = DATEPART(ww,@ImportDate) - 1
上述逻辑有效,但不考虑近年。换句话说,所有前几年的'X'周的不需要的数据将包括在比较中。因此,必须将谓词扩展到占多年,这反过来又要求处理新的年度边界:2012年第1周应与2011年第51周进行比较。
如果没有详细的谓词,怎么能这样做呢?
更新 由于需要将“一年中的一周”视为星期二到星期二,这个问题变得复杂了。我目前的“正确”尝试体现在下面的[VerboseCheck]案例中。
SET DATEFIRST 2
DECLARE @ImportDate date = '2011-1-4'
DECLARE @DateOpen date = '2010-12-20'
select @ImportDate,
YEAR(@DateOpen),
DATEPART(ww, @DateOpen),
YEAR(DATEADD(dd,-14,@ImportDate)),
DATEPART(ww,DATEADD(dd,-14,@ImportDate)),
CASE WHEN
YEAR(@DateOpen) + DATEPART(ww, @DateOpen) =
YEAR(DATEADD(dd,-14,@ImportDate)) + DATEPART(ww,DATEADD(dd,-14,@ImportDate))
THEN 1 ELSE 0 END [VerboseCheck],
CASE WHEN DATEDIFF (ww, @DateOpen, @ImportDate) =2
THEN 1 ELSE 0 END [SimpleCheck]
[SimpleCheck]会很完美,但它提供了与[VerboseCheck]不同的答案。如果我再推进@DateOpen一天,那么两个给出相同的答案。这表明两者都没有以同样的方式表彰DATEFIRST评估。
答案 0 :(得分:1)
为什么不只是DATEADD('dd', -14, DateOpen)
?
答案 1 :(得分:1)
似乎DateDiff最好在这里使用。但是,正如您注意到DATEFIRST is indeed not respected。
所以我们只需添加Itzik Ben-Gan's solution即可获得
WHERE DATEDIFF (ww,
DATEADD( day, -@@DATEFIRST , @DateOpen),
DATEADD( day, -@@DATEFIRST , @ImportDate)
) =2
答案 2 :(得分:0)
以下工作会比较这些年份吗?
WHERE ( DATEPART(ww,MA.DateOpen) + 1 ) % 52 = DATEPART(ww,@ImportDate) - 1
AND YEAR(MA.DateOpen)=YEAR(DATEADD(d, -14, @ImportDate))