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'
Biểu thức (extract(year from age(birth_date)) + 1) * interval '1' year tính tuổi vào sinh nhật tiếp theo trong (đầy đủ) năm. Khi thêm ngày đó vào ngày sinh, điều này sẽ sinh ra ngày sinh tiếp theo.
Diễn viên là cần thiết để có được một date thực quay lại, vì date + interval trả về dấu thời gian (bao gồm cả thời gian).
Nếu bạn xóa where điều kiện, bạn sẽ nhận được tất cả các sinh nhật "tiếp theo".
Bạn cũng có thể nhận danh sách các sinh nhật sắp tới trong ví dụ:30 ngày tiếp theo bằng cách sử dụng một cái gì đó như thế này:
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;