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'
La expresión (extract(year from age(birth_date)) + 1) * interval '1' year
calcula la edad en el próximo cumpleaños en años (completos). Al agregar eso a la fecha de nacimiento, esto da el próximo cumpleaños.
El elenco es necesario para obtener una date
real atrás, porque date + interval
devuelve una marca de tiempo (incluida una hora).
Si elimina el where
condición, obtendrá todos los "próximos" cumpleaños.
También puede obtener una lista de los próximos cumpleaños en, p. los próximos 30 días usando algo como esto:
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;