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'
Udtrykket (extract(year from age(birth_date)) + 1) * interval '1' year
beregner alderen ved næste fødselsdag i (hele) år. Når du tilføjer det til fødselsdatoen, giver dette den næste fødselsdag.
Rollebesætningen er nødvendig for at få en rigtig date
tilbage, fordi date + interval
returnerer et tidsstempel (inklusive et tidspunkt).
Hvis du fjerner where
tilstand, får du alle "næste" fødselsdage.
Du kan også få en liste over de kommende fødselsdage i f.eks. de næste 30 dage ved at bruge noget som dette:
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;