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'
Der Ausdruck (extract(year from age(birth_date)) + 1) * interval '1' year
berechnet das Alter beim nächsten Geburtstag in (ganzen) Jahren. Addiert man das zum Geburtsdatum, ergibt sich der nächste Geburtstag.
Die Besetzung ist notwendig, um ein echtes date
zu erhalten zurück, weil date + interval
gibt einen Zeitstempel zurück (einschließlich einer Uhrzeit).
Wenn Sie das where
entfernen Bedingung erhalten Sie alle "nächsten" Geburtstage.
Sie können auch eine Liste der bevorstehenden Geburtstage erhalten, z. die nächsten 30 Tage, indem Sie etwa so vorgehen:
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;