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'
De uitdrukking (extract(year from age(birth_date)) + 1) * interval '1' year
berekent de leeftijd op de eerstvolgende verjaardag in (volledige) jaren. Als je dat bij de geboortedatum optelt, krijg je de volgende verjaardag.
De cast is nodig om een echte date
te krijgen terug, omdat date + interval
geeft een tijdstempel terug (inclusief een tijd).
Als u de where
. verwijdert staat, krijg je alle "volgende" verjaardagen.
U kunt ook een lijst krijgen van de komende verjaardagen in b.v. de komende 30 dagen met zoiets als dit:
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;