sql >> Databasteknik >  >> RDS >> Sqlserver

Hur får man det första och sista datumet för innevarande år?

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


  1. Hur lägger man till ojdbc7 till Java webbapp av Gradle?

  2. Steg för steg uppgraderingsprocess till R12.2 Uppgradering del -3

  3. Ändra tabell för att ändra kolumns standardvärde

  4. Kontrollera om sekvensen finns i Postgres (plpgsql)