Como calcular a idade de uma pessoa no MySQL

Você tem uma ou várias datas de nascimento armazenadas em um banco de dados MySQL e gostaria de calcular as idades de cada pessoa, em relação à data de hoje.
O problema pode ser solucionado computando o intervalo entre as datas — sendo que a mesma abordagem pode ser usada para resolver inúmeras outras situações.
mysql logo over gray ubuntu wallpaper
Determinar a idade envolve calcular o intervalo, decorrido em anos, entre duas datas — mas você não pode fazer isto apenas dividindo a quantidade de dias decorridos por 365, sob pena de obter um resultado inexato — uma vez que este método não inclui os anos bissextos.
Algumas metodologias fazem a divisão por 365,25, o que ajuda a obter resultados menos inexatos.
Neste texto, vou abordar alguns métodos mais precisos para calcular a idade em anos e meses.

Como determinar uma idade em anos

Como já foi dito, não dá para efetuar a operação, contando o número de dias percorridos entre a data de nascimento e a data alvo, uma vez que anos diferentes podem ter uma quantidade diferente de dias.
Uma outra possibilidade é deduzir o ano de nascimento do ano atual. Veja:

SELECT YEAR('2015-06-22')-YEAR('1913-10-19')
    ->  AS "Idade de Vinícius de Moraes"\G
*************************** 1. row ***************************
Idade de Vinícius de Moraes: 102
1 row in set (0.00 sec)

O problema desta abordagem, é que em Junho de 2015, o poeta Vinícius de Moraes ainda teria 101 anos — uma vez que seu mês de nascimento é Outubro.
Ao lidar com clientes, sabemos que algumas pessoas se incomodam quando lhes atribuímos uma idade acima da que realmente têm — por isto é que precisamos determinar suas idades de maneira mais precisa.
Veja outro exemplo (mais complexo) da aplicação deste método.

SELECT NomeCliente AS Cliente,
    ->  DATE_FORMAT(DataNascimentoCliente,'%d de %M de %Y') AS "Data nasc.",
    ->  YEAR(CURDATE()) - YEAR(DataNascimentoCliente) AS Idade
    ->  FROM CadastroClientes
    ->  WHERE YEAR(DataNascimentoCliente) > 1983;

Em destaque, as idades que estão “adiantadas” em relação 22 de Junho de 2015:

+-------------------+-------------------------+-------+
| Cliente           | Data nasc.              | Idade |
+-------------------+-------------------------+-------+
| Christen Wiggins  | 11 de abril de 1984     |    31 |
| Justine Howard    | 22 de dezembro de 1984  |    31 |
| Anika Hammond     | 01 de agosto de 1985    |    30 |
| Alea Vang         | 09 de julho de 1984     |    31 |
| Fredericka Jensen | 29 de fevereiro de 1984 |    31 |
| Alexa Duncan      | 09 de abril de 1985     |    30 |
| Lynn Mclean       | 11 de novembro de 1984  |    31 |
| Allegra Cantrell  | 19 de março de 1984     |    31 |
+-------------------+-------------------------+-------+
8 rows in set (0.00 sec)

Exemplos de uso da função TIMESTAMPDIFF, para calcular a idade exata

Para evitar qualquer desconforto, criado pela falta de exatidão, use a função TIMESTAMPDIFF() — com ela, é possível obter a idade exata de uma pessoa.
Veja um exemplo de uso:

SELECT TIMESTAMPDIFF (YEAR,'1913-10-19',CURDATE())
    ->  AS "Idade de Vinícius de Moraes";

Se a data atual for 22 de Junho de 2015, o resultado para a idade de Vinícius de Moraes é:

+------------------------------+
| Idade de Vinícius de Moraes  |
+------------------------------+
|                          101 |
+------------------------------+
1 row in set (0.00 sec)

A lista de aniversariantes, anterior, também muda (para melhor) com esta abordagem:

SELECT NomeCliente AS Nome,
    ->  DATE_FORMAT(DataNascimentoCliente, '%d de %M de %Y') AS Nascimento,
    ->  TIMESTAMPDIFF(YEAR,DataNascimentoCliente,CURDATE()) AS Idade
    ->  FROM CadastroClientes
    ->  WHERE YEAR(DataNascimentoCliente) > 1983;
+-------------------+-------------------------+-------+
| Nome              | Nascimento              | Idade |
+-------------------+-------------------------+-------+
| Christen Wiggins  | 11 de abril de 1984     |    31 |
| Justine Howard    | 22 de dezembro de 1984  |    30 |
| Anika Hammond     | 01 de agosto de 1985    |    29 |
| Alea Vang         | 09 de julho de 1984     |    30 |
| Fredericka Jensen | 29 de fevereiro de 1984 |    31 |
| Alexa Duncan      | 09 de abril de 1985     |    30 |
| Lynn Mclean       | 11 de novembro de 1984  |    30 |
| Allegra Cantrell  | 19 de março de 1984     |    31 |
+-------------------+-------------------------+-------+
8 rows in set (0.00 sec)

Como obter a idade em meses ou dias

A função TIMESTAMPDIFF() permite estabelecer o resultado em MESES ou DIAS, de maneira simples.
Vejamos quantos meses de idade a cantora Pitty tem:

SELECT TIMESTAMPDIFF (MONTH,'1977-10-07',CURDATE()) AS "Idade da Pitty"\G
*************************** 1. row ***************************
Idade da Pitty: 452
1 row in set (0.00 sec)

Ou em dias:

SELECT TIMESTAMPDIFF (DAY,'1977-10-07',CURDATE()) AS "Idade da Pitty"\G
*************************** 1. row ***************************
Idade da Pitty: 13772
1 row in set (0.00 sec)

Este método pode ser usado em várias outras situações, como estabelecer há quanto tempo um documento está vencido, calcular dívidas etc.
Referência: http://dev.mysql.com/doc/refman/5.7/en/date-calculations.html

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como “Rick and Morty” e “BoJack Horseman”.
Me siga no Twitter e vamos trocar ideias!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *