Obtenez l'âge
Pour une raison quelconque, nous semblons nous retrouver sur une énorme quantité de projets où les dates sont comparées. Pendant ce temps, nous avons développé un certain nombre de fonctions pour accélérer et assurer l'intégrité de ces données.
La raison pour laquelle nous avons créé cela était que le fait de déterminer un âge où quelqu'un était né au cours d'une année bissextile pouvait se retrouver avec une variance d'un jour. Dans une année bissextile, le 29/02 est le même jour de l'année que le 01/03.
Nous utilisons deux dates, car cela vous permet de antidater l'heure à laquelle vous avez besoin de l'âge, (comme une date de décès), et de ne par défaut que la date actuelle si elle est laissée vierge.
Comme nous ne croyons pas à réinventer la roue, nous avons laissé notre code ici pour quiconque pourrait le trouver utile. Cela nécessite une fonction secondaire liée ci-dessous.
CREATE FUNCTION Dates.GetAge(@Date DATETIME2,@Until DATETIME2) RETURNS INT AS BEGINIF @Until IS NULL SET @Until=CONVERT(DATE,GETDATE())DECLARE @Age INT=DATEDIFF(YEAR,@Date,@Until)+(CASE WHEN DATEPART(DAYOFYEAR,@Date)>(DATEPART(DAYOFYEAR,@Until)+(CASE WHEN dbo.GetLeapYear(@Until)=1 AND DATEPART(DAYOFYEAR,@Until)>59 THEN -1 ELSE 0 END))THEN -1 ELSE 0 END)RETURN @AgeENDGO
SELECT Dates.GetAge('2011-02-28','2013-02-27'),Dates.GetAge('2011-02-28','2013-02-28'),Dates.GetAge('2011-02-28','2013-03-01'),Dates.GetAge('2011-02-28','2013-03-02')SELECT Dates.GetAge('2011-02-28','2012-02-27'),Dates.GetAge('2011-02-28','2012-02-28'),Dates.GetAge('2011-02-28','2012-02-29'),Dates.GetAge('2011-02-28','2012-03-01')SELECT Dates.GetAge('2012-02-28','2013-02-27'),Dates.GetAge('2012-02-28','2013-02-28'),Dates.GetAge('2012-02-28','2013-03-01'),Dates.GetAge('2012-02-28','2013-03-02')SELECT Dates.GetAge('2012-02-29','2013-02-27'),Dates.GetAge('2012-02-29','2013-02-28'),Dates.GetAge('2012-02-29','2013-03-01'),Dates.GetAge('2012-02-29','2013-03-02')
Jusqu'à présent, les tests n'ont révélé aucune anomalie, mais veuillez nous en informer si vous en trouvez.