[Code] Calcular Edad a cualquier fecha

Este problema normalmente se soluciona del lado del cliente (Reporte, Aplicación) pero algunas ocaciones necesitamos presentarlo en algunas consultas por lo que la siguiente función puede ser práctica en varios escenarios

Tomemos como ejemplo las siguientes fechas (obsérvese especialmente la última fecha que muestra el número de día siguiente, diez años) y veamos cómo las funciones tradicionales muestran la diferencia en años, pero el cálculo no es correcto para la edad del usuario, incluso en la segunda aproximación tratando de solucionarlo por meses tampoco obtenemos el resultado esperado.

declare @Fechas table (FechaNacimiento date)
declare @hoy date
set
@hoy = GETDATE()

insert into @Fechas values (‘1978-05-20’)
insert into @Fechas values (‘1963-01-14’)
insert into @Fechas values (DATEADD(yyyy,-10, DATEADD(dd,1,@hoy)))

 select  * from @Fechas

select

DATEDIFF(yyyy,FechaNacimiento, @hoy), cast(DATEDIFF(mm, FechaNacimiento, @hoy) as decimal) / 12 from @Fechas

Obtendremos resultados como (dependiendo de la fecha en que se ejecute el script, dado que toma la fecha actual del sistema):

Edad Esperada Diferencia Años Diferencia Meses
33 33 33.416666
48 48 48.750000
9 10 10.000000

Ahora la solución propuesta para éste problema es crear una función que lo resuelva retornando el valor adecuado, incluso para fechas diferentes a la actual (se puede enviar como parámetro la fecha a la que quiero calcular la edad)

create 

function ObtenerEdad(@FechaNacimiento date, @AFecha date = null)
returns int
Begin

declare @hoy date, @Edad int
if
@hoy is null set @hoy = GETDATE() else set @hoy = @AFecha

set 

@Edad = CASE WHEN MONTH(@FechaNacimiento) > MONTH(@hoy) THEN (YEAR(@hoy)
 – YEAR(@FechaNacimiento) 1) WHEN MONTH(@hoy) = MONTH(@FechaNacimiento) 
 AND DAY(@FechaNacimiento) > DAY(@hoy) THEN YEAR(@hoy) YEAR(@FechaNacimiento)
 – 1 ELSE YEAR(@hoy) YEAR(@FechaNacimiento) END

return @Edad
End

go

Si intento de nuevo con los valores ingresados inicialmente obtenendré la edad correcta en cada caso

 select dbo.ObtenerEdad(FechaNacimiento) as Edad, DATEDIFF(yyyy,FechaNacimiento, @hoy), cast(DATEDIFF(mm, FechaNacimiento, @hoy) as decimal) / 12
from @Fechas

Espero sea de ayuda,

 

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP