Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment obtenir la première et la dernière date de l'année en cours ?

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