2011-11-01 60 views
0

我想比較本週(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評估。

回答

1

似乎最好在這裏使用DateDiff。但是,正如你注意到DATEFIRST is indeed not respected

所以我們只需要添加Itzik Ben-Gan's solution,我們得到

WHERE DATEDIFF (ww, 
    DATEADD(day, [email protected]@DATEFIRST , @DateOpen), 
    DATEADD(day, [email protected]@DATEFIRST , @ImportDate) 
    ) =2 
+0

我更新了我的問題以包含DATEFIRST問題,我認爲這個問題阻止DATEDIFF按照提議工作。 –

+0

所以星期一應該定義一個星期而不是星期六 –

+0

其實我檢查過,DateDiff尊重它,但星期二是星期一開始,但2011年有53個星期,當時你是'Datefirst = 2'肯定這應該是2011年的第51周,或者是(2011年的週數 - 1) –

1

爲什麼不是DATEADD('dd', -14, DateOpen)

+0

這是不完全正確。由於2011年第51周的日期和2012年的第1周可能不完全相隔14天 –

0

會像下面的工作來比較幾年?

WHERE (DATEPART(ww,MA.DateOpen) + 1) % 52 = DATEPART(ww,@ImportDate) - 1 
AND YEAR(MA.DateOpen)=YEAR(DATEADD(d, -14, @ImportDate))