SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
De bovenstaande query geeft een datetime-waarde voor middernacht aan het begin van 31 december. Dit is ongeveer 24 uur korter dan het laatste moment van het jaar. Als u de tijd wilt opnemen die op 31 december kan vallen, moet u deze vergelijken met de eerste van het volgende jaar, met een <
vergelijking. Of je kunt vergelijken met de laatste paar milliseconden van het huidige jaar, maar dit laat nog steeds een gat achter als je iets anders gebruikt dan DATETIME (zoals 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
Andere perioden
Deze aanpak heeft twee leuke aspecten:goede prestaties en het kan gemakkelijk worden gewijzigd voor andere perioden door beide exemplaren van yy
te vervangen. (=jaar) met een andere tekenreeks:
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Let op voor weken:de startdag is afhankelijk van de serverinstellingen.)
Technische details
Dit werkt door het aantal jaren sinds 1900 te berekenen met DATEDIFF(yy, 0, GETDATE())
en dat vervolgens toe te voegen aan een datum van nul =1 jan. 1900. Dit kan worden gewijzigd om voor een willekeurige datum te werken door de GETDATE()
te vervangen gedeelte of een willekeurig jaartal door de DATEDIFF(...)
. te vervangen functie met "Jaar - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015