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,
Artículo ComboBox using ExtJS and ASP.NET MVC By John Charles Olamendy Dynamics CRM COMException: The