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