Averiguar edad - Función GetAge
Por alguna razón parece que acabamos en una gran cantidad de proyectos en los que se comparan fechas. A lo largo de este tiempo hemos desarrollado una serie de funciones para acelerar y garantizar la integridad de estos datos.
La razón por la que creamos esta función fue porque al calcular la edad de una persona nacida en un año bisiesto se podía producir una variación de un día. En un año bisiesto, el 29/02 es el mismo día del año que el 01/03.
Utilizamos dos fechas, ya que la función permite antedatar el momento en que se requiere la edad, (como una fecha de defunción), y sólo por defecto en la fecha actual si se deja en blanco.
Como no queremos volver a inventar la rueda, hemos dejado aquí nuestro código para cualquiera que pueda considerarlo útil. Esto requiere una función secundaria vinculada a continuación.
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')
Las pruebas realizadas hasta ahora no han revelado ninguna anomalía, pero avísanos si encuentras alguna.