2011-07-05 10 views
9

Próbowałem już poszukać soln, ale nie mogłem go jeszcze znaleźć.Serwer SQL Wybierz ostatnie 4 tygodnie od teraz i ten sam okres z ubiegłego roku.

Muszę wybrać ostatnie 4 tygodnie danych z dzisiejszej daty, która nie jest problemem, ponieważ właśnie robię date >= Dateadd(mm, -1, getdate()). Jednak chcę również te same 4 tygodnie danych z poprzedniego roku. Ale nie chcę (na przykład) od 1 do 30 czerwca 2010 r. I od 1 do 30 czerwca 2011 r., Potrzebowałbym

30 czerwca (czwartek) 2011 r. I 4 tygodnie przed I 1 lipca i cztery tygodnie przed 1 lipca jako pierwszy był czwartek w tym samym tygodniu z poprzedniego roku.

, więc zostanie zwrócone 8 tygodni danych.

Dzięki za pomoc!

+0

Co logika używasz, aby wybrać '6/30/2011' zamiast' 7/7/2011'? – JNK

+0

@JNK To '7/1/2010' i jeśli odejmiesz 52 tygodnie od' 6/30/2011', otrzymasz '7/1/2010'. – Fosco

Odpowiedz

15

Można użyć trochę więcej DATEADD() dobroci, aby wrócić do poprzedniego roku:

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

odjęcie 52 tygodni od 6/30/2011 zwrotów 7/1/2010 jak żądanych ... Potem za pomocą swojego oryginalne odjęcie 1 miesiąca od dolnej granicy.

Można również przełączyć całą rzecz do używania tygodnie ...

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

+1 - Powinien używać tygodni zamiast miesiąca dla spójności. – JNK

+0

Co, jeśli chcę uzyskać ostatnie 12 tygodni zamiast 4 tygodni? – Si8

+0

Następnie użyj drugiego przykładu, zmień -4 na -12, -56 na -64. – Fosco

0

można zrobić seryjny ored między warunkami:

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 

ja rozumiem dobrze?

+0

Nie wydaje się, aby obsłużyć tydzień wydania wspomnianego op, wybierając 4 tygodnie kończące się 30 czerwca 2011 r. I 4 tygodnie kończące się 7 stycznia 2010 r. – Fosco

Powiązane problemy