2011-07-05 24 views
9

Tôi đã thử tìm kiếm một giải pháp cho điều này nhưng chưa thể tìm thấy.Máy chủ SQL Chọn 4 tuần qua từ bây giờ và cùng kỳ từ năm ngoái chỉ

Tôi cần chọn 4 tuần dữ liệu cuối cùng từ ngày đến ngày không phải là vấn đề khi tôi chỉ thực hiện date >= Dateadd(mm, -1, getdate()). Tuy nhiên tôi cũng muốn có cùng 4 tuần dữ liệu từ năm trước. Nhưng tôi không muốn (ví dụ) từ ngày 1-30 tháng 6 năm 2010 và ngày 1-30 tháng 6 năm 2011, tôi cần

ngày 30 tháng 6 (thứ năm) 2011 và 4 tuần trước và ngày 1 và 4 tháng 7 trước ngày 1 tháng 7 là thứ năm trong cùng tuần từ năm trước.

vì vậy 8 tuần dữ liệu sẽ được trả lại.

Cảm ơn sự giúp đỡ!

+0

Logic gì bạn đang sử dụng để chọn '6/30/2011' thay vì '7/7/2011'? – JNK

+0

@JNK It's '7/1/2010' và nếu bạn trừ đi 52 tuần từ ngày' 6/30/2011' bạn sẽ nhận được '7/1/2010'. – Fosco

Trả lời

15

Bạn có thể sử dụng một số chi tiết DATEADD() tốt đẹp quay trở lại với năm trước:

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())))) 

Trừ 52 tuần kể từ 2011/06/30 lợi nhuận 7/1/2010 như bạn yêu cầu ... Sau đó, sử dụng của bạn phép trừ ban đầu của 1 tháng từ đó cho giới hạn dưới.

Bạn cũng có thể chuyển đổi toàn bộ điều để sử dụng tuần ...

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

+1 - Anh ấy nên sử dụng tuần thay vì tháng để nhất quán. – JNK

+0

Nếu tôi muốn nhận 12 tuần qua thay vì 4 tuần thì sao? – Si8

+0

Sau đó sử dụng ví dụ thứ hai, thay đổi -4 đến -12, -56 đến -64. – Fosco

0

bạn có thể làm một sê-ri của ORed GIỮA điều kiện:

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 

đã làm tôi hiểu phải không?

+0

Điều này dường như không giải quyết được vấn đề trong tuần mà op được đề cập, chọn 4 tuần kết thúc vào ngày 30/6/2011 và 4 tuần kết thúc vào ngày 7/1/2010. – Fosco

Các vấn đề liên quan