Získejte věk
Zdá se, že z nějakého důvodu skončíme na velkém množství projektů, kde se porovnávají data. Během této doby jsme vyvinuli řadu funkcí pro zrychlení a zajištění integrity těchto dat.
Důvod, proč jsme to vytvořili, spočíval v tom, že vypracování věku, ve kterém se někdo narodil v přestupném roce, může skončit s rozptylem jednoho dne. V přestupném roce je 29/02 stejný den v roce jako 01/03.
Používáme dvě data, protože vám umožňuje aktualizovat čas, který jste požadovali, věk (jako je datum úmrtí), a výchozí hodnotu pouze v aktuálním datu, pokud zůstane prázdné.
Protože nevěříme v znovuobjevení kola, nechali jsme tady náš kód pro kohokoli, kdo to bude považovat za užitečný. To vyžaduje sekundární funkci spojenou níže.
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')
Dosavadní testování neodhalilo žádné anomálie, dejte nám prosím vědět, pokud nějaké najdete.