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'
Výraz (extract(year from age(birth_date)) + 1) * interval '1' year
vypočítá věk při nejbližších narozeninách v (úplných) letech. Když to přidáte k datu narození, získáte další narozeniny.
Obsazení je nezbytné pro získání skutečného date
zpět, protože date + interval
vrátí časové razítko (včetně času).
Pokud odstraníte where
podmínkou, dostanete všechny "příští" narozeniny.
Seznam nadcházejících narozenin můžete také získat např. následujících 30 dní pomocí něčeho takového:
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;