2011-07-05 24 views
9

我已經試過尋找一個soln到這個,但一直無法找到一個。SQL Server從現在開始選擇過去4星期和去年同一時間段只有

我需要從今天的日期中選擇最後4周的數據,這不是問題,因爲我只是做了date >= Dateadd(mm, -1, getdate())。不過,我也想要去年同樣的4週數據。但我不想(例如)2010年6月1日至30日和2011年6月1日至30日,我需要

2011年6月30日(星期四)和4周以及7月1日和4周之前,因爲7月1日是星期四在上一年的同一周。

因此會返回8周的數據。

感謝您的幫助!

+0

您正在使用什麼邏輯來選擇'6月30日/ 2011'而不是'7/7/2011'? – JNK

+0

@JNK它是'7/1/2010',如果你從'6/30/2011'減去52周,你會得到'7/1/1/2010'。 – Fosco

回答

15

你可以使用一些更DATEADD()善良回到前一年:

where theDate >= DATEADD(mm, -1, GETDATE())  
OR 
    (theDate <= DATEADD(week,-52,convert(datetime,GETDATE())) 
    and 
    theDate >= DATEADD(mm,-1,DATEADD(week,-52,convert(datetime,GETDATE())))) 

減去52周從6/30/2011 7/1/2010回報,你要求的...然後使用原來從那裏減去1個月的下限。

你也可以切換使用周整個事情...

where theDate >= DATEADD(week, -4, GETDATE())  
OR 
    (theDate <= DATEADD(week,-52,convert(datetime,GETDATE())) 
    and 
    theDate >= DATEADD(week,-56,convert(datetime,GETDATE()))) 
+0

+1 - 他應該使用周而不是月來保持一致性。 – JNK

+0

如果我想獲得最後12周而不是4周,該怎麼辦? – Si8

+0

然後使用第二個示例,將-4更改爲-12,將-56更改爲-64。 – Fosco

0

你可以做或運算的串行BETWEEN條件:

select 
    ... 
from 
    ... 
where 
    1=1 
    or date between Dateadd(mm, -2, getdate()) and Dateadd(mm, -1, getdate()) 
    or date between Dateadd(mm, -11, getdate()) and Dateadd(mm, -10, getdate()) 
order by 
    date 

沒有我的理解對不對?

+0

這似乎並不處理本週提到的問題,選擇截至6/30/2011的4周以及截至2010年7月1日的4周。 – Fosco