jueves, 15 de abril de 2010

DateDiff y CASE para agrupar por rangos de edad a partir de la fecha de nacimiento en SQL

Es muy normal almacenar en las bases de datos la fecha de nacimiento en vez de la edad y calcular a partir de ese valor la edad en cada ocasión que sea necesario.

Este cálculo lo podemos hacer muy fácil con DateDiff . Esta función necesita el tipo de comparación de fechas (años, meses…) la fecha inicial y la fecha final, devolviendo el valor que separa las dos fechas en base al tipo de comparación

DATEDIFF(year, tbPersona.FNAC, { fn NOW() })
Esto lo podemos complicar un poco más si lo que necesitamos no es la edad exacta sino que tenemos que englobar esa edad dentro de un rango (menores de 18, entre 18 y 40,…) Para esto podemos utilizar CASE, indicando según la edad el rango al que pertenece.

CASE
     When edad <19 THEN ‘menor edad’
     WHEN edad <41 THEN ‘Entre 18 y 40
     ELSE ‘Mayor 40’
END
Si unimos los dos puntos anteriores podemos crear una consulta que nos agrupe por franjas de edad a partir de la fecha de nacimiento

SELECT COUNT(Persona.ID) AS Personas
CASE
    WHEN DATEDIFF(year, Persona.FNAC, { fn NOW() }) < 25 THEN '16-24'
    WHEN DATEDIFF(year, Persona.FNAC, { fn NOW() }) < 45 THEN '25-44'
    ELSE '45-65'
END AS Edad
FROM Persona
GROUP BY CASE WHEN DATEDIFF(year, Persona.FNAC, { fn NOW() }) < 25 THEN '16-24' WHEN DATEDIFF(year, Persona.FNAC, { fn NOW() }) < 45 THEN '25-44' ELSE '45-65' END