1
resposta

Resolução: calcule a idade com base na data de nascimento

SELECT nome,
CAST(STRFTIME('%Y',DATE('0000-01-01',CONCAT('+',JULIANDAY(CURRENT_DATE)-JULIANDAY(datanascimento),' days'))) AS INT)
Idade
from TabelaClientes;

OU

SELECT Nome,
case when strftime('%m', 'now') > strftime('%m', DataNascimento)
or (strftime('%m', 'now') = strftime('%m', DataNascimento)
and strftime('%d', 'now') >= strftime('%d', DataNascimento))
THEN strftime('%Y', 'now') - strftime('%Y', DataNascimento)
else strftime('%Y', 'now') - strftime('%Y', DataNascimento) - 1 END AS Idade
FROM TabelaClientes;

A segunda forma é mais precisa. A resolução do professor pode ter problemas se a data atual for no mesmo mês de aniversário de um cliente, mas ainda não ultrapassou o numero de dias, ex.: 31/05/1990. Pela resolução do professor, o cliente já teria 36, quando ainda tem 35.

1 resposta

Olá, Michel. Como vai?

Excelente observação! Você tocou em um ponto crítico e muito comum no desenvolvimento de software e análise de dados: as regras de negócio para transição de datas (os famosos "corner cases" ou casos de borda).

O seu raciocínio está totalmente correto. Calcular a idade apenas subtraindo os anos (ANO_ATUAL - ANO_NASCIMENTO) gera o erro que você descreveu: se a pessoa faz aniversário amanhã, o sistema já daria a ela uma idade que ela ainda não completou.

A sua segunda solução, utilizando a estrutura CASE WHEN, é de fato muito mais precisa e robusta porque ela valida o cenário completo do mês e do dia atual.

Para enriquecer o tópico e ajudar os colegas do fórum, vamos analisar por que a sua lógica funciona tão bem e trazer uma alternativa ainda mais enxuta para o ecossistema do SQLite (SGDB utilizado no curso).

Entendendo a sua solução com CASE WHEN

A sua lógica analisa perfeitamente as duas condições em que a pessoa já fez aniversário no ano corrente:

  1. Se o mês atual é maior que o mês de nascimento (strftime('%m', 'now') > strftime('%m', DataNascimento)).
  2. Se estamos no mesmo mês, mas o dia atual é maior ou igual ao dia de nascimento (strftime('%d', 'now') >= strftime('%d', DataNascimento)).

Se uma dessas condições for verdadeira, subtraímos os anos diretamente. Caso contrário (ou seja, ela faz aniversário ainda este ano), subtraímos o ano e retiramos 1. Perfeito!

Uma alternativa elegante e otimizada para SQLite

Como estamos trabalhando com strings formatadas no SQLite, existe um "truque" de formatação muito utilizado no mercado que simplifica toda essa estrutura do CASE WHEN para uma única linha de código. Podemos concatenar o ano, mês e dia no formato YYYYMMDD e fazer uma subtração matemática simples. Veja como fica:

SELECT Nome,
(CAST(strftime('%Y%m%d', 'now') AS INT) - CAST(strftime('%Y%m%d', DataNascimento) AS INT)) / 10000 AS Idade
FROM TabelaClientes;

Por que isso funciona e não erra o dia?
Imagine que hoje seja 30/05/2026 (20260530) e o cliente nasceu em 31/05/1990 (19900531).

  • Fazendo a subtração direta como inteiros: 20260530 - 19900531 = 359999
  • Ao dividir por 10000: 35.9999
  • Como o banco trunca a divisão inteira (ou se aplicarmos a conversão), o resultado é exatamente 35 anos. Ele só mudará para 36 amanhã, quando a conta der 360000 / 10000 = 36.

Parabéns pela percepção aguçada sobre a consistência dos dados. É essa atenção aos detalhes que diferencia um bom profissional de dados!

Espero que possa ter lhe ajudado!