滑动周比较

时间:2011-11-01 17:16:33

标签: sql sql-server tsql datetime refactoring

我想将当前一周(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评估。

3 个答案:

答案 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))