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'
Uttrycket (extract(year from age(birth_date)) + 1) * interval '1' year
beräknar åldern vid nästa födelsedag i (fullständiga) år. När du lägger till det till födelsedatumet ger detta nästa födelsedag.
Rollbesättningen är nödvändig för att få ett riktigt date
tillbaka, eftersom date + interval
returnerar en tidsstämpel (inklusive en tid).
Om du tar bort where
skick får du alla "nästa" födelsedagar.
Du kan även få en lista över de kommande födelsedagarna i t.ex. de kommande 30 dagarna med något i stil med detta:
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;