sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan får man den første og sidste dato for indeværende år?

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 


  1. SQL Server Blocking Query

  2. Værktøjer til at arbejde med lagrede procedurer i Oracle, i et team?

  3. Sådan opretter du en sammensat fremmednøgle i SQL Server (T-SQL-eksempel)

  4. At lave en enhedsrammemodel spænder over flere databaser