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'
Изразът (extract(year from age(birth_date)) + 1) * interval '1' year
изчислява възрастта на следващия рожден ден в (пълни) години. Когато добавите това към датата на раждане, това дава следващия рожден ден.
Актьорският състав е необходим, за да получите истинска date
назад, защото date + interval
връща клеймо за време (включително време).
Ако премахнете where
условие, ще получите всички "следващи" рождени дни.
Можете също така да получите списък с предстоящите рождени дни напр. следващите 30 дни, използвайки нещо подобно:
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;