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'
Wyrażenie (extract(year from age(birth_date)) + 1) * interval '1' year
oblicza wiek następnych urodzin w (pełnych) latach. Dodając to do daty urodzenia, daje to następne urodziny.
Rzut jest niezbędny, aby uzyskać prawdziwą date
z powrotem, ponieważ date + interval
zwraca znacznik czasu (w tym godzinę).
Jeśli usuniesz where
warunek, otrzymasz wszystkie „następne” urodziny.
Listę nadchodzących urodzin możesz też otrzymać m.in. przez następne 30 dni używając czegoś takiego:
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;