Ao lidar com aniversários ou “aniversários”, você precisa definir como lidar com o caso especial em 29 de fevereiro em anos bissextos.
Ao testar as faixas de datas, o dia Feb 29 geralmente é incluído automaticamente, mesmo que o ano atual não seja um ano bissexto . O intervalo de dias é estendido por 1 retroativamente quando abrange esse dia.
Por outro lado, se o ano atual for um ano bissexto e você quiser procurar por 15 dias, poderá obter resultados por 14 dias em anos bissextos se seus dados forem de anos sem salto.
Minha consulta 1. e 2. incluem 29 de fevereiro apenas em anos bissextos. Bob tem aniversário apenas a cada 4 anos.
Para substanciar meu ponto, fiz um teste extenso com todas as soluções apresentadas. Eu adaptei cada uma das consultas à tabela dada e obtive resultados idênticos sem ORDER BY .
A boa notícia: todos eles estão corretos e produzem o mesmo resultado – exceto pela consulta de Gordon que tinha erros de syntax e @ consulta do wildplasser que falha quando o ano se aproxima (fácil de corrigir).
Insira 108.000 linhas com datas aleatórias do século 20, que é semelhante a uma tabela de pessoas vivas (13 anos ou mais).
Além de pequenas otimizações, a principal diferença é adicionar apenas a quantidade exata de anos date_trunc('year', age(current_date + 14, event_date)) para obter o aniversário deste ano, o que evita a necessidade de um CTE completo: