Calculando a idade usando MySQL
Veja como calcular a idade utilizando MySQL
Um problema muito comum para quem trabalha com banco de dados é calcular a idade com base na data de nascimento. A primeira vista, parece ser algo muito simples, mas, a aparente simplicidade esconde vários problemas. Existem várias formas de chegar neste resultado, vamos ver como resolver este problema utilizando o banco de dados MySQL.
Primeiro vamos criar uma tabela com os dados que vamos utilizar neste artigo.
CREATE TABLE clientes (
id int NOT NULL AUTO_INCREMENT,
nome VARCHAR(255),
data_nascimento DATE,
PRIMARY KEY (id)
);
INSERT INTO clientes (nome, data_nascimento) VALUES ("GILMAR", "1984-11-09");
INSERT INTO clientes (nome, data_nascimento) VALUES ("FATIMA", "1966-11-05");
INSERT INTO clientes (nome, data_nascimento) VALUES ("GISLAINE", "2003-08-30");
INSERT INTO clientes (nome, data_nascimento) VALUES ("ZIFIRINA", "1972-08-01");
INSERT INTO clientes (nome, data_nascimento) VALUES ("BRENO", "2003-07-10");
INSERT INTO clientes (nome, data_nascimento) VALUES ("JEAN", "1974-12-26");
INSERT INTO clientes (nome, data_nascimento) VALUES ("VALDEMIR", "1987-01-19");
INSERT INTO clientes (nome, data_nascimento) VALUES ("BIANCA", "1999-09-14");
INSERT INTO clientes (nome, data_nascimento) VALUES ("HELOA", "2012-08-25");
INSERT INTO clientes (nome, data_nascimento) VALUES ("LORENNA", "2017-11-28");
INSERT INTO clientes (nome, data_nascimento) VALUES ("LAURA", "2020-07-05");
INSERT INTO clientes (nome, data_nascimento) VALUES ("ERIBALDO", "1962-04-22");
INSERT INTO clientes (nome, data_nascimento) VALUES ("SONIA", "1966-08-26");
INSERT INTO clientes (nome, data_nascimento) VALUES ("EDVAN", "1992-08-01");
INSERT INTO clientes (nome, data_nascimento) VALUES ("EDUARDO", "1996-10-25");
INSERT INTO clientes (nome, data_nascimento) VALUES ("ELIANE", "1985-09-30");
INSERT INTO clientes (nome, data_nascimento) VALUES ("GILDEON", "1992-09-28");
INSERT INTO clientes (nome, data_nascimento) VALUES ("LAURA", "2012-07-05");
INSERT INTO clientes (nome, data_nascimento) VALUES ("JOSE", "1970-03-18");
INSERT INTO clientes (nome, data_nascimento) VALUES ("IZADORA", "2001-08-16");
INSERT INTO clientes (nome, data_nascimento) VALUES ("ISABELLA", "2003-06-12");
INSERT INTO clientes (nome, data_nascimento) VALUES ("DJANIRA", "1958-02-24");
INSERT INTO clientes (nome, data_nascimento) VALUES ("JOELMA", "1980-04-15");
INSERT INTO clientes (nome, data_nascimento) VALUES ("CLAUDIO", "1982-09-06");
Subtrair o ano da data de nascimento e o ano da data atual
Essa é a forma mais simples e rápida que a maioria das pessoas que está começando a trabalhar com banco de dados escolhe para resolver o problema.
SELECT nome, data_nascimento, YEAR(CURDATE()) - YEAR(data_nascimento) as idade FROM clientes
A função YEAR() permite extrair o ano da data informada como parâmetro, já a função CURDATE() retorna a data atual. Na consulta acima extraimos o ano da data atual e subtraimos pelo ano da data de nascimento do registro atual.
Apesar de ser a forma mais fácil, esta é a forma errada de resolver o problema. Nosso cálculo tomou como base o ano, sem considerar as demais informações da data. Se hoje for 22/09/2019 e a data de nascimento for 10/10/1970, o resultado vai ser 49. O correto seria 48.
Com certeza precisamos de uma abordagem diferente para resolver o problema.
Calcular a diferença em dias e dividir o resultado
Uma forma mais precisa é calcular a diferença em dias entre a data de nascimento e a data atual e depois dividir pelo número de dias do ano.
SELECT nome, data_nascimento, DATEDIFF(curdate(),data_nascimento) / 365) as idade FROM moradores
A função DATEDIFF() retorna a diferença em dias entre duas datas. Para calcular a quantidade de anos dividimos o resultado por 365. Perceba que o resultado não veio na forma de um número inteiro. Desta forma, vamos precisar ajustar a nossa consulta para arredondar o resultado para baixo, para isso vamos utilizar a função FLOOR() e passar como parâmetro o nosso cálculo.
SELECT nome, data_nascimento, FLOOR(DATEDIFF(curdate(),data_nascimento) / 365) as idade FROM clientes
O DATEDIFF() é muito prático quando queremos calcular a diferença de dias entre datas. Uma outra forma de fazer isso seria utilizar a função TO_DAYS(). Esta função retorna a diferença de dias entre a data informada e o ano zero. Usando esta função, nosso cálculo ficaria assim
SELECT nome, data_nascimento, FLOOR(TO_DAYS(curdate()) - TO_DAYS(data_nascimento)) / 365) as idade FROM clientes
Considerando os anos bissextos
Você deve estar se perguntando sobre os anos bissextos. Como fazer para que eles não impactem o nosso cálculo? Podemos adaptar o cálculo anterior e dividir por 365.25
SELECT nome, data_nascimento, FLOOR(TO_DAYS(curdate()) - TO_DAYS(data_nascimento)) / 365.25) as idade FROM clientes
Uma outra forma de tentar abordar este problema seria a seguinte:
SELECT nome, data_nascimento, YEAR(CURDATE()) - YEAR(data_nascimento) -
(DATE_FORMAT(CURDATE(), "%m%d") < DATE_FORMAT(data_nascimento, "%m%d")) as idade
FROM clientes
Perceba que este exemplo é parecido com o primeiro exemplo que vimos, a diferença foi que existe uma subtração com base numa condição. A função DATE_FORMAT() formata uma data num padrão específico, neste caso as duas datas foram formatadas no formato mês/dia.
Ao fazer este tipo de comparação, a resposta pode ser true, que equivale a 1, ou false, que equivale a zero. A comparação é para ver se o dia/mês da primeira data(data atual) é menor que o dia/mês da segunda data (data de nascimento).
Como você viu, a função DATE_FORMAT() recebe como primeiro parâmetro a máscara que deve ser aplicada no resultado. As opções de máscara são as seguintes:
%a - Nome do dia da semana.
%b - Abreviação do nome do mês.
%c - Número do mês.
%D - Dia do mês, acompanhado de sufixo indicando posição.
%d - Dia do mês.
%f - Microsegundos.
%H - Horas.
%i - Minutos.
%j - Número do dia no ano.
%M - Nome do mês.
%p - AM ou PM.
%S - Segundos.
%U - Número da semana, considerando domingo como primeiro dia da semana.
%W - Nome do dia da semana.
%Y - Ano com 4 dígitos.
Será que não existe uma forma mais fácil e segura de chegar no resultado desejado? Sim, existe uma forma mais fácil, é o que vamos ver a seguir.
Utilizando TIMESTAMPDIFF
A função TIMESTAMPDIFF() permite retornar a diferença entre duas expressões date time num formato a nossa escolha. Veja como ficou simples o nosso cálculo de idade.
SELECT nome, data_nascimento, TIMESTAMPDIFF(YEAR, data_nascimento, CURDATE()) as idade FROM clientes.
No exemplo anterior, a função TIMESTAMPDIFF() recebeu três parâmetros, o primeiro foi o formato de resposta desejado, que em nosso caso foi YEAR(), já que desejamos um número inteiro referente a diferença em anos entre as duas datas. Já os dois parâmetros seguintes são as datas que serão subtraídas.
Esta função nos permite vários tipos de retorno. As opções de retorno que podemos obter da subtração de datas são as seguintes.
- FRAC_SECOND: Microsegundos.
- SECOND: Segundos.
- MINUTE: Minutos
- HOUR: Hora
- DAY: Dia
- WEEK: Semana
- MONTH: Mês
- QUARTER: Trimestre
- YEAR: Ano
Caso você não queira uma resposta em inteiro, pode sofisticar a resposta retornando a quantidade de anos e meses da idade, para isso você pode combinar a função TIMESTAMPDIFF() com a função CONCAT(). A função CONCAT() permite concatenar diferentes conteúdos. Nosso cálculo ficaria da seguinte forma:
SELECT nome, data_nascimento, CONCAT(TIMESTAMPDIFF(YEAR, data_nascimento, CURDATE()), " ANOS, ", MOD(TIMESTAMPDIFF(MONTH, data_nascimento, CURDATE()), 12), " MESES") as idade FROM clientes;
No exemplo anterior concatenamos a quantidade de anos com a diferença de meses. A função MOD() retorna o resto da divisão do número de meses de diferença entre as datas por 12.
Encerramento
Neste artigo você viu como calcular a idade utilizando MySQL.
Caso você trabalhe com o SQL Server, eu recomendo você ver o link a seguir.
Calculando a idade usando SQL Server
E caso você trabalhe com PHP ou JavaScript, os links a seguir podem ser de seu interesse
Calculando a idade com JavaScript