SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
Powyższe zapytanie podaje wartość datetime dla północy na początku 31 grudnia. Jest to około 24 godziny za ostatnią chwilą roku. Jeśli chcesz uwzględnić czas, który może przypadać 31 grudnia, powinieneś porównać z pierwszym dniem następnego roku, za pomocą <
porównanie. Możesz też porównać z kilkoma ostatnimi milisekundami bieżącego roku, ale to nadal pozostawia lukę, jeśli używasz czegoś innego niż DATETIME (np. DATETIME2):
SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear
Inne okresy
Takie podejście ma dwa fajne aspekty:dobrą wydajność i można je łatwo zmienić na inne okresy, zastępując oba wystąpienia yy
(=rok) z innym ciągiem:
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Uważaj na tygodnie:dzień rozpoczęcia zależy od ustawień serwera).
Szczegóły techniczne
Działa to poprzez obliczenie liczby lat od 1900 roku za pomocą DATEDIFF(yy, 0, GETDATE())
a następnie dodając to do daty zero =1 stycznia 1900. Można to zmienić, aby działało dla dowolnej daty, zastępując GETDATE()
część lub dowolny rok, zastępując DATEDIFF(...)
funkcja z "Rok - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015