Trucos MySQL - Calcular la edad a partir de la fecha de nacimiento
Posted Under: Bases de Datos
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 ocurrrió hacerme una pequeña herramienta web para poder 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 |
En este pequeño tutorial hemos visto el uso de las funciones CURDATE(), DATE_FORMAT(FECHA, FORMATO) y YEAR(FECHA)







