10 de Septiembre de 2021
Trucos MySQL - Calcular la edad a partir de la fecha de nacimiento
Autoría: Daniel Ibáñez
Desde que se me perdió el móvil por segunda vez pensé que, si pasaba una tercera vez, no quería tener que pedir de nuevo el teléfono a mis amigos así que, friki de mi, se me ocurrió hacer una pequeña herramienta web para tener una sencilla agenda y poder consultar sus datos sin importar dónde estuviese.
Hace como dos días, mi amigo Gonzalo me preguntó la edad de Pablo, y, como programador que soy le dije:
- "Es tan sencillo como decirle al servidor mysql: SELECT `AMIGOS`.`F_NACIMIENTO` FROM `AMIGOS` WHERE `AMIGOS`.`NOMBRE`='PABLO' AND `AMIGOS`.`APELLIDO`='IGLESIAS'; ".
La cara que se le quedó fue un auténtico cuadro, y tras responderme que estaba loco, le dije: "Tu tranquilo, que yo te lo demuestro".
Todo confiado, accedí a mi servidor y lancé la mencionada consulta. El servidor, tan servil como siempre me devolvió: "1983-05-10", pero, todo este ingenio, acabó con un: "Bah, este dato no es suficiente, yo quiero la edad, no la fecha de nacimiento".
Así que, se abrió un frente en mi mente:
Para conseguir la edad de mis amigos, utilizaremos la tabla AMIGOS de mi agenda.
La primera idea fue: "Voy a restar al año actual el año de nacimiento", así que generé la consulta:
Lo que tendría que usar mi consulta serían:
- Una llamada a la función CURDATE()
- Dos llamadas a la función YEAR(FECHA)
SELECT `AMIGOS`.`NOMBRE`, YEAR(CURDATE())-YEAR(`AMIGOS`.`F_NACIMIENTO`) AS `EDAD_ACTUAL` FROM `AMIGOS` WHERE `AMIGOS`.`NOMBRE`='PABLO' AND `AMIGOS`.`APELLIDO`='IGLESIAS';
Pero los resultados no eran correctos, ya que los resultados obtenidos, el día 10-04-2008 eran:
`AMIGOS`.`NOMBRE` | `EDAD_ACTUAL` |
PABLO | 25 |
Sin embargo, y aunque Pablo aparenta ser mayor de lo que es, a esa fecha sólo tenía 24.
La consulta no tenía en cuenta el mes y el año de nacimiento, ya que si aún no has cumplido los años, no tendrías que contabilizarla.
La solución se basaba en restar uno a la edad si el mes y día de nacimiento eran posteriores al mes y día actual.
Así que, nos servimos de la función DATE_FORMAT.
Lo que tendría que añadir a mi consulta serían:
- Una llamada a la función CURDATE()
- Una llamada a la función DATE_FORMAT(FECHA, FORMATO)
- Una cláusula IF para discernir si ya ha sido su cumpleaños o no
SELECT `AMIGOS`.`NOMBRE`, YEAR(CURDATE())-YEAR(`AMIGOS`.`F_NACIMIENTO`) + IF(DATE_FORMAT(CURDATE(),'%m-%d') > DATE_FORMAT(`AMIGOS`.`F_NACIMIENTO`,'%m-%d'), 0 , -1 ) AS `EDAD_ACTUAL` FROM `AMIGOS` WHERE `AMIGOS`.`NOMBRE`='PABLO' AND `AMIGOS`.`APELLIDO`='IGLESIAS';
Con lo que los resultados obtenidos el día 10-04-2008 fueron:
`AMIGOS`.`NOMBRE` | `EDAD_ACTUAL` |
PABLO | 24 |
Y así es como en este pequeño tutorial hemos visto el uso de las funciones CURDATE(), DATE_FORMAT(FECHA, FORMATO) y YEAR(FECHA).
¿Quieres conocer otro trucos en MySQL? Aprende a gestionar bases de datos relacionales con MySQL o desarrolla problemas con juegos de caracteres - Illegal mix of collations.
Publicado originalmente el 21 de abril de 2019, actualizado el 10 de julio de 2021.