SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
Ovenstående forespørgsel giver en datetime-værdi for midnat i begyndelsen af den 31. december. Dette er omkring 24 timer mindre end årets sidste øjeblik. Hvis du vil inkludere tid, der kan forekomme den 31. december, skal du sammenligne med det første af det næste år med en <
sammenligning. Eller du kan sammenligne med de sidste par millisekunder af indeværende år, men dette efterlader stadig et hul, hvis du bruger noget andet end DATETIME (såsom DATETIME2):
SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear, DATEADD(åå, DATEDIFF(åå, 0, GETDATE()) + 1, 0) AS FirstOfNextYear, DATEADD(ms, -3, DATEADD(åå, DATODIFF(åå, 0, GETDATE()) + 1, 0)) SOM LastTimeOfYear
Andre perioder
Denne tilgang har to gode aspekter:god ydeevne, og den kan nemt ændres til andre perioder ved at erstatte begge forekomster af yy
(=år) med en anden streng:
åå, åååå årqq, q quartermm, m monthwk, ww week
(Vær forsigtig med uger:startdagen afhænger af serverindstillingerne.)
Tekniske detaljer
Dette virker ved at finde ud af antallet af år siden 1900 med DATEDIFF(åå, 0, GETDATE())
og derefter tilføje det til en dato på nul =1. januar 1900. Dette kan ændres til at fungere på en vilkårlig dato ved at erstatte GETDATE()
del eller et vilkårligt år ved at erstatte DATEDIFF(...)
funktion med "Årgang - 1900."
SELECT DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015, DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015