¿Cuántas veces no tenemos que sacar, en una consulta, la edad de una persona a partir de su fecha de nacimiento? Es una consulta que me toca hacer habitualmente (y que, mira por dónde, nunca había comentado aquí). ¿Cómo lo hacemos en SQL-Server?
Pensemos que tenemos una tabla clientes, donde hay un campo de tipo DATE llamado FechaNac en el que almacenamos sus fechas de nacimiento. Podrías creer que lo más simple es hacer lo siguiente:
Select DATEDIFF(YEAR,FechaNac,GETDATE()) as Edad from clientes
Pero hay un problema: Esa solución sólo resta los años, no tiene en cuenta el mes y el día ¿qué pasaría entonces? Que nos pondría la edad que ese cliente va a cumplir durante este año, no su edad real. ¿Cómo lo solucionamos? Hay muchas opciones, yo he optado por esta:
Select DATEDIFF(YEAR,FechaNac,GETDATE()) -(CASE WHEN DATEADD(YY,DATEDIFF(YEAR,clientes.FechaNac,GETDATE()),clientesFechaNac)>GETDATE() THEN 1 ELSE 0 END) as Edad from clientes
Lo que hacemos es sumar la diferencia de años a la fecha de nacimiento y, en caso de que fuera posterior a hoy (es decir, todavía no ha cumpliado años) restamos 1 a la diferencia, si no restamos 0 y nos quedamos como estamos.
Otra opción, más elegante, podría ser esta:
Select floor( (cast(convert(varchar(8),getdate(),112) as int)- cast(convert(varchar(8),clientes.FechaNac,112) as int) ) / 10000 ) as edad from clientes
En este caso convertimos la fecha al formato clásico de base de datos como una cadena que aglutina pegados Fecha, mes y día y lo convertimos a un entero (hoy nos quedaría por ejemplo 20151001), se lo restamos a la fecha de nacimiento, dividimos entre diez mil para obtener el año y redondeamos por defecto con la función floor().
Me fue útil! Gracias!
gracias.. !!!
Muchas gracias ingeniero..
una pregunta entonces si yo solo quiero mostrar los clientes que cumplen años en el mes actual como seria la consulta
Usa la función MONTH() sobre la fecha en la condición del where para saberlo.
En la última consulta, muy ingeniosa por cierto, no hace falta el floor. Al castear al tipo int el resultado de la división también será int.
Cierto es, las operaciones con int siempre devuelven int. Aunque en el momento en el que lo escribí no lo sabía.
excelente es la formula mas exacta de calcular la fecha
La segunda consulta no me daba un resultado correcto, la escribí en vez de copiar y pegar. Luego dí con que en la explicación dice dividir por mil y en el ejemplo divide por diez mil. Ahora sí funciona perfecto!
Gracias por tu comentario, ahora mismo corrijo el error.
es una pedorrez! nunca en todo el año no cambia la edad!
es una pena que sólo publiques los comentarios positivos, tengo la corrección de tu mal código pero como no permites hacer críticas no te lo puedo enviar
Eso que dices es completamente falso. En el año sí cambia la edad. Yo trabajo en el sector salud y el código publicado sí funciona. Tienes que tener algo de sentido común y no ser un programador mediocre para darte cuenta que no es sólo restar el año.
¿Y esa supuesta corrección pa’cuando?
Pues amí me ha funcionado a la perfección. Gracias por el ejemplo.
Gracias por la publicación. Es muy útil.
Te agradezco mucho por el aporte, ambos métodos funcionan perfectamente aunque en lo personal, y para solucionar mi consulta, opte por el segundo… Felicidades!!!
Tengo una pregunta para que sirve el 112 que pones al final de de Getdate
El 112 es para que convierta la fecha a formato yyyymmdd. Aquí tienes un enlace con los códigos de todos los formatos: https://www.w3schools.com/sql/func_sqlserver_convert.asp
Muchas gracias, me ayudó totalmente!!
Saludos desde Perú.