Biểu thức
age('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)
cho 30 days
. Chúng tôi đang mong đợi 1 month
vì cả hai giá trị đều trỏ đến những ngày cuối cùng của tháng. Nếu chúng tôi thêm 1 ngày vào các giá trị, chúng tôi sẽ nhận được những ngày đầu tiên của tháng tới và
age('2012-12-01 00:00:00'::timestamp, '2012-11-01 00:00:00'::timestamp)
sẽ cho chúng tôi 1 tháng như mong đợi. Vì vậy, chúng ta hãy kiểm tra xem chúng ta có hai ngày cuối cùng của tháng hay không và trong trường hợp này là khoảng thời gian trả về tuổi của những ngày tiếp theo. Trong các trường hợp khác, chúng tôi sẽ trả về khoảng tuổi của các giá trị ban đầu:
create or replace function age_m (t1 timestamp, t2 timestamp)
returns interval language plpgsql immutable
as $$
declare
_t1 timestamp = t1+ interval '1 day';
_t2 timestamp = t2+ interval '1 day';
begin
if extract(day from _t1) = 1 and extract(day from _t2) = 1 then
return age(_t1, _t2);
else
return age(t1, t2);
end if;
end $$;
Một số ví dụ:
with my_table(date1, date2) as (
values
('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
('2012-12-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
('2013-01-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
('2013-02-28 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)
)
select *, age(date1, date2), age_m(date1, date2)
from my_table
date1 | date2 | age | age_m
---------------------+---------------------+----------------+--------
2012-11-30 00:00:00 | 2012-10-31 00:00:00 | 30 days | 1 mon
2012-12-31 00:00:00 | 2012-10-31 00:00:00 | 2 mons | 2 mons
2013-01-31 00:00:00 | 2012-10-31 00:00:00 | 3 mons | 3 mons
2013-02-28 00:00:00 | 2012-10-31 00:00:00 | 3 mons 28 days | 4 mons
(4 rows)