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

Come ottenere la prima e l'ultima data dell'anno in corso?

SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear

La query precedente fornisce un valore datetime per la mezzanotte all'inizio del 31 dicembre. Questo è circa 24 ore prima dell'ultimo momento dell'anno. Se vuoi includere l'ora che potrebbe verificarsi il 31 dicembre, dovresti confrontare con il primo dell'anno successivo, con un < confronto. Oppure puoi confrontare gli ultimi millisecondi dell'anno in corso, ma questo lascia ancora uno spazio vuoto se stai utilizzando qualcosa di diverso da DATETIME (come 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

Altri periodi

Questo approccio ha due aspetti interessanti:buone prestazioni e può essere facilmente modificato per altri periodi sostituendo entrambe le occorrenze di yy (=anno) con una stringa diversa:

yy, yyyy    year
qq, q       quarter
mm, m       month
wk, ww      week 

(Attenzione alle settimane:il giorno di inizio dipende dalle impostazioni del server.)

Dettagli tecnici

Funziona calcolando il numero di anni trascorsi dal 1900 con DATEDIFF(yy, 0, GETDATE()) e quindi aggiungendolo a una data pari a zero =1 gennaio 1900. Questo può essere modificato in modo che funzioni per una data arbitraria sostituendo GETDATE() parte o un anno arbitrario sostituendo DATEDIFF(...) funzione con "Anno - 1900."

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015