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.
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
2 replies on “Como calcular a idade de uma pessoa no MySQL”
Valeu Elias! Muito bem explicado, parabéns!
😉