select birth_date,
cast(birth_date + ((extract(year from age(birth_date)) + 1) * interval '1' year) as date) as next_birthday
from person
where name = 'Bob'
A expressão
(extract(year from age(birth_date)) + 1) * interval '1' year
calcula a idade no próximo aniversário em anos (completos). Ao adicionar isso à data de nascimento, isso dá o próximo aniversário. O elenco é necessário para obter uma
date
real de volta, porque date + interval
retorna um carimbo de data/hora (incluindo uma hora). Se você remover o
where
condição, você receberá todos os "próximos" aniversários. Você também pode obter uma lista dos próximos aniversários em, por exemplo, nos próximos 30 dias usando algo assim:
select next_birthday,
next_birthday - current_date as days_until_next
from (
select birth_date,
cast(birth_date + ((extract(year from age(birth_date)) + 1) * interval '1' year) as date) as next_birthday
from person
) as upcoming
where upcoming.next_birthday <= current_date + 30
order by next_birthday;