SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
La requête ci-dessus donne une valeur datetime pour minuit au début du 31 décembre. C'est environ 24 heures avant le dernier moment de l'année. Si vous souhaitez inclure une heure susceptible de se produire le 31 décembre, vous devez comparer avec le premier de l'année suivante, avec un <
comparaison. Ou vous pouvez comparer les dernières millisecondes de l'année en cours, mais cela laisse encore un vide si vous utilisez autre chose que DATETIME (comme 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
Autres périodes
Cette approche a deux aspects intéressants :de bonnes performances et elle peut facilement être modifiée pour d'autres périodes en remplaçant les deux occurrences de yy
(=année) avec une chaîne différente :
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Attention aux semaines :le jour de démarrage dépend des paramètres du serveur.)
Détails techniques
Cela fonctionne en déterminant le nombre d'années depuis 1900 avec DATEDIFF(yy, 0, GETDATE())
puis en ajoutant cela à une date de zéro =1er janvier 1900. Cela peut être changé pour fonctionner pour une date arbitraire en remplaçant le GETDATE()
portion ou une année arbitraire en remplaçant le DATEDIFF(...)
fonction avec "Année - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015