Odpowiedzi:
Następujące polecenie dodaje -1 lat do bieżącej daty:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
Tę stronę znalazłem, szukając rozwiązania, które pomogłoby mi w doborze wyników z poprzedniego roku kalendarzowego. Większość wyników pokazanych powyżej wydaje się zwracać elementy z ostatnich 365 dni, które nie działały w moim przypadku.
Jednocześnie dało mi to wystarczający kierunek, aby rozwiązać moje potrzeby w poniższym kodzie - który zamieszczam tutaj dla wszystkich innych, którzy mają takie same potrzeby jak moje i którzy mogą natknąć się na tę stronę w poszukiwaniu rozwiązania.
SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))
Dziękuję tym, których rozwiązania pomogły mi osiągnąć to, czego potrzebowałem.
Cóż, myślę, że czegoś tu brakuje. Użytkownik chce uzyskać dane z ostatniego roku, a nie z ostatnich 365 dni. Różnica jest ogromna. Moim zdaniem dane z ostatniego roku to wszystkie dane z 2007 roku (jeśli jestem teraz w 2008 roku). Zatem prawidłowa odpowiedź brzmiałaby:
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1
Następnie, jeśli chcesz ograniczyć to zapytanie, możesz dodać inny filtr, ale zawsze w ostatnim roku.
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
Najbardziej czytelny, IMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
Który:
Istnieją warianty z DATEDIFF i DATEADD, które zapewniają dzisiejszą północ, ale są raczej tępe (choć nieco lepsze pod względem wydajności - nie żebyś zauważył w porównaniu do odczytów wymaganych do pobrania danych).
GETDATE () zwraca bieżącą datę i godzinę .
Jeśli ostatni rok zaczyna się o północy bieżącego dnia ubiegłego roku (jak w oryginalnym przykładzie), należy użyć czegoś takiego:
DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) -- getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start
Inne sugestie są dobre, jeśli masz „tylko SQL”.
Sugeruję jednak, aby - jeśli to możliwe - obliczyć datę w swoim programie i wstawić ją jako ciąg w zapytaniu SQL.
Przynajmniej dla dużych tabel (np. Kilka milionów wierszy, być może w połączeniu z łączeniami), co da znaczną poprawę szybkości, ponieważ optymalizator może pracować z tym znacznie lepiej.
argument funkcji DATEADD:
DATEADD (*datepart* , *number* , *date* )
data może być następująca: rr, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms
liczba to wyrażenie, które można przetłumaczyć na liczbę całkowitą, która jest dodawana do części daty
date to wyrażenie, które można przetłumaczyć jako wartość czasu, daty, smalldatetime, datetime, datetime2 lub datetimeoffset.
declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
select @sYear + @sMonth
set @iMonth = @iMonth - 1
end
Podobnie jak @DE White, przyjechałem tutaj z podobnych, ale innych powodów niż pierwotne pytanie. Oryginalne pytanie dotyczy ostatnich 365 dni. Zapewnia to odpowiedź @ samjudson. Odpowiedź @DE White zwraca wyniki za poprzedni rok kalendarzowy.
Moje zapytanie jest nieco inne, ponieważ działa w odniesieniu do poprzedniego roku do bieżącej daty włącznie:
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
Na przykład 17 lutego 2017 r. To zapytanie zwraca wyniki od 1 stycznia 2016 r. Do 17 lutego 2017 r
Miałem podobny problem, ale poprzedni programista podał datę tylko w formacie mm-rrrr. Moje rozwiązanie jest proste, ale niektórym może okazać się pomocne (chciałem też mieć pewność, że spacje początkowe i końcowe zostały wyeliminowane):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())