Como calcular a idade em SQL (PostgreSQL, MySQL, SQL Server)
Aprenda padrões SQL práticos para calcular a idade a partir da data de nascimento: anos completos, anos e meses exatos e idade a partir de uma data específica. Inclui exemplos para PostgreSQL, MySQL e SQL Server.
Precisa calcular a idade no SQL a partir da data de nascimento? Este guia mostra consultas práticas e prontas para cópia para bancos de dados comuns. Você aprenderá como calcular:
- Idade em anos (anos completos)
- Idade em uma data específica (não apenas hoje)
- Uma saída de estilo exato (anos e meses) quando você precisar de mais detalhes
1) Decida o que "idade" significa para seu caso de uso
A maior parte da lógica de negócios usa anos concluídos. Isso significa que alguém nascido em 10/06/2000 terá 25 anos em 10/06/2026, não antes. Tenha cuidado com a subtração de ano simples, como ANO(hoje) - ANO(dob), porque está errado antes do aniversário.
2) PostgreSQL: idade em anos (anos completos)
O PostgreSQL possui uma função age() integrada que retorna um intervalo. Extraia anos completos assim:
SELECT EXTRACT(YEAR FROM age(CURRENT_DATE, dob)) AS age_years
DE pessoas;
PostgreSQL: idade a partir de uma data específica
SELECT EXTRACT(YEAR FROM age(DATE '2026-02-23', dob)) AS age_years
DE pessoas;
3) MySQL: idade em anos (anos completos)
No MySQL, use TIMESTAMPDIFF:
SELECT TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age_years
DE pessoas;
MySQL: idade a partir de uma data específica
SELECT TIMESTAMPDIFF(YEAR, dob, DATE('2026-02-23')) AS age_years
DE pessoas;
4) SQL Server: idade em anos (anos completos)
Um padrão comum no SQL Server é DATEDIFF menos um cheque de aniversário:
SELECIONE
DATEDIFF(ANO, dob, CAST(GETDATE() AS data))
- CASO
WHEN DATEADD(YEAR, DATEDIFF(YEAR, dob, CAST(GETDATE() AS data)), dob) > CAST(GETDATE() AS data)
ENTÃO 1 MAIS 0
END AS idade_anos
DE pessoas;
SQL Server: idade a partir de uma data específica
DECLARE @as_of date = '2026-02-23';
SELECIONAR
DATEDIFF(ANO, data de nascimento, @as_of)
- CASO
WHEN DATEADD(ANO, DATEDIFF(ANO, dob, @as_of), dob) > @as_of
ENTÃO 1 MAIS 0
END AS idade_anos
DE pessoas;
5) Exemplo de idade exata (anos e meses)
Se você quiser uma apresentação "exata" como "31 anos 4 meses", calcule primeiro os anos e depois os meses após o último aniversário. Aqui está um exemplo do PostgreSQL:
COM base COMO (
SELECIONE data, CURRENT_DATE AS as_of
DE pessoas
)
SELECIONAR
EXTRACT(YEAR FROM age(as_of, dob)) AS anos,
EXTRACT(MONTH FROM age(as_of, dob)) AS meses
DA base;
Armadilhas comuns
- Fusos horários: armazene DOB como uma
dataquando possível. Os horários podem mudar entre zonas. - Aniversários em dias bissextos: defina o que acontece em anos não bissextos. A maioria dos sistemas trata os aniversários de 29/02/2004 como 28/02 ou 01/03, dependendo da política.
- DOB nulo ou futuro: filtrar ou proteger, caso contráriosua consulta retornará valores nulos ou negativos.
Verificação rápida de integridade
Se quiser verificar um único nascimento rapidamente, você pode usar a calculadora online: Calcular idade online.
Guias relacionados
- Como calcular a idade (guia completo)
- Como calcular a idade no Excel
- Como calcular a idade em JavaScript
Perguntas frequentes
Por que ANO(hoje) menos ANO(dob) está errado?
Ignora se o aniversário já aconteceu neste ano, por isso exagera a idade antes do aniversário.
Qual é o tipo SQL mais seguro para data de nascimento?
Use uma coluna de data (não datahora) para DOB se você se preocupa apenas com o dia do calendário.