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;