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'
L'expression (extract(year from age(birth_date)) + 1) * interval '1' year
calcule l'âge au prochain anniversaire en années (complètes). En ajoutant cela à la date de naissance, cela donne le prochain anniversaire.
Le casting est nécessaire pour obtenir une vraie date
retour, car date + interval
renvoie un horodatage (incluant une heure).
Si vous supprimez le where
condition, vous aurez tous les "prochains" anniversaires.
Vous pouvez également obtenir une liste des anniversaires à venir, par ex. les 30 prochains jours en utilisant quelque chose comme ceci :
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;