SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
Ovanstående fråga ger ett datetime-värde för midnatt i början av den 31 december. Detta är cirka 24 timmar mindre än årets sista ögonblick. Om du vill inkludera tid som kan inträffa den 31 december bör du jämföra med det första nästa år, med en <
jämförelse. Eller så kan du jämföra med de senaste millisekunderna av innevarande år, men detta lämnar fortfarande ett gap om du använder något annat än DATETIME (som 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
Andra perioder
Detta tillvägagångssätt har två trevliga aspekter:bra prestanda och det kan enkelt ändras för andra perioder genom att ersätta båda förekomsterna av yy
(=år) med en annan sträng:
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Var försiktig med veckor:startdagen beror på serverinställningarna.)
Tekniska detaljer
Detta fungerar genom att räkna ut antalet år sedan 1900 med DATEDIFF(yy, 0, GETDATE())
och sedan lägga till det till ett datum på noll =1 januari 1900. Detta kan ändras för att fungera för ett godtyckligt datum genom att ersätta GETDATE()
del eller ett godtyckligt år genom att ersätta DATEDIFF(...)
funktion med "År - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015