Calcolare l'eta' tramite l'utilizzo di una funzione
Utilizzo
Per qualche motivo sembra che ci ritroviamo su un'enorme quantità di progetti in cui le date vengono confrontate. Durante questo periodo abbiamo sviluppato una serie di funzioni per velocizzare e garantire l'integrità di questi dati.
Il motivo per cui l'abbiamo creato è che calcolare un'età in cui qualcuno è nato in un anno bisestile potrebbe finire con una variazione di un giorno. In un anno bisestile, il 29/02 è lo stesso giorno dell'anno del 01/03.
Utilizziamo due date, in quanto ti consente di retrodatare l'ora in cui hai richiesto l'età (come una data di morte) e solo per impostazione predefinita la data corrente se lasciata vuota.
Poiché non crediamo nel reinventare la ruota, abbiamo lasciato il nostro codice qui per chiunque lo possa trovare utile. Ciò richiede una funzione secondaria collegata di seguito.
Get Age
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
Test
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')
Risultati
I test finora non hanno rivelato alcuna anomalia, tuttavia fateci sapere se ne trovate.