Voltar para o Blog
3 min read

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.

Como calcular a idade em SQL (PostgreSQL, MySQL, 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 data quando 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

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.