martes, 31 de julio de 2012

Calcular la edad en SQL con una Funcion

A veces en proyectos de orden social nos encontramos en que debemos calcular la edad de una persona a partir de su fecha de nacimiento, y pues los primero que a uno se le ocurre es restar las dos fechas con la función datediff:

select DATEDIFF(year,fNacimiento,getdate()) from personas
Sin embargo esta respuesta no es tan exacta por que no tiene en cuenta si ya cumplió o no años, para solucionar eso, hay que evaluar si la fecha de cumpleaños ya paso y si es así sumar un año.

select
DATEDIFF(year,fNacimiento,getdate() )+   
case
when ( Month(getdate()) < Month(fNacimiento) Or
(Month(getdate()) = Month(fNacimiento) And
Day(getdate()) < day(fNacimiento))) Then -1 else 0 end
as edad from personas

Ahora esto lo podemos poner en una función para calcular la edad cada vez que lo necesite, asi:


CREATE FUNCTION [dbo].[fnEdad]
(-- Add the parameters for the function here@fNacimiento datetime,
@fdiligenciamiento datetime
)RETURNS int
AS
BEGIN
-- Declare the return variable hereDECLARE @ResultVar int
set @ResultVar = DATEDIFF(year,@fNacimiento,@fdiligenciamiento )+   
case
when ( Month(@fdiligenciamiento) < Month(@fNacimiento) Or (Month(@fdiligenciamiento) = Month(@fNacimiento) And Day(@fdiligenciamiento) < day(@fNacimiento))) Then -1 else 0 end
RETURN @ResultVar
END

Ahora podemos utilizar la función fnEdad para calcular la edad de una persona, incluso si queremos saber la edad en una fecha especifica se envia como segundo parametro la edad en la que se desea calcular dicha fecha:

select dbo.FnEdad(fechanacimiento,getdate()) as edad from personas

Espero les sea de utilidad!
Saludos!

7 comentarios:

  1. Muchas gracias por este articulo me sirvio bastante.

    ResponderEliminar
  2. viejo para la proxima no pongas colores tan locos =/ azul marino con fondo oscuro... pero muchas gracias por la info...

    ResponderEliminar
  3. Estimado muy buen aporte me sirvió de mucho para lo que estoy realizando, gracias.

    ResponderEliminar
  4. Creo que se podria mejorar la función con un solo comparador AND y teniendo en cuenta que la persona hace años una vez ha pasado el día de su aniversario, no al empezar.

    select
    DATEDIFF(year,fNacimiento,getdate() )+
    case
    when ( (Month(getdate()) <= Month(fNacimiento)) AND
    (Day(getdate()) <= day(fNacimiento))) Then -1 else 0 end
    as edad from personas

    ResponderEliminar
  5. Buen aporte, sin embargo, en ese caso que mencionas la formula no serviría si por ejemplo calculamos el cumpleaños el día 22 de abril para una persona que nació el 2 de mayo, pues en ese caso el día de cálculo es mayor que el día de nacimiento por lo que no se cumpliría la condición de restar uno a la edad y mostraría erróneamente la edad.
    Saludos, y gracias por comentar!

    ResponderEliminar
  6. Como calculo la fecha de nacimiento apartir de la edad en SQL????

    ResponderEliminar
  7. Buenas tardes, para hacer eso, solo debes utilizar la funcion dateadd para restarle la edad de la persona a la fecha actual (getdate()),

    supongamos que quiere saber la fecha de nacimiento de alguien que tiene 31 años, 3 meses y 5 dias, la sentencia serìa como sigue:

    select dateadd(day,-5,dateadd(month,-3,dateadd(year,-31,getdate())))

    como se puede dar cuenta es una función anidada, en la cual, en la primer agrupación resto los años, luego resto los meses y finalmente resto los dias.

    Espero le sirva!

    ResponderEliminar