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'
L'espressione (extract(year from age(birth_date)) + 1) * interval '1' year
calcola l'età al prossimo compleanno in anni (completi). Quando lo aggiungi alla data di nascita, questo dà il compleanno successivo.
Il cast è necessario per ottenere una vera date
indietro, perché date + interval
restituisce un timestamp (incluso un orario).
Se rimuovi where
condizione, riceverai tutti i "prossimi" compleanni.
Puoi anche ottenere un elenco dei compleanni imminenti ad es. nei prossimi 30 giorni utilizzando qualcosa del genere:
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;