Uzyskaj wiek
Z jakiegoś powodu wydaje się, że kończy się na ogromnej liczbie projektów, w których porównywane są daty. W tym czasie opracowaliśmy szereg funkcji w celu przyspieszenia i zapewnienia integralności tych danych.
Powodem, dla którego to stworzyliśmy, było to, że wypracowanie wieku, w którym ktoś urodził się w roku przestępnym, może zakończyć się odchyleniem jednego dnia. W roku przestępnym 29/02 jest tego samego dnia co 01/03.
Używamy dwóch dat, ponieważ pozwala to na cofnięcie daty wymaganego wieku (np. Datę śmierci) i domyślną datę bieżącą, jeśli pozostanie puste.
Ponieważ nie wierzymy w ponowne wynalezienie koła, zostawiliśmy nasz kod tutaj dla każdego, kto może uznać go za przydatny. Wymaga to dodatkowej funkcji powiązanej poniżej.
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')
Dotychczasowe testy nie ujawniły żadnych anomalii, jednak daj nam znać, jeśli je znajdziesz.