अभिव्यक्ति
age('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)
30 days
gives देता है . हम उम्मीद कर रहे हैं 1 month
क्योंकि दोनों मान महीने के अंतिम दिनों की ओर इशारा करते हैं। यदि हम मूल्यों में 1 दिन जोड़ते हैं तो हमें अगले महीने के पहले दिन मिलेंगे और
age('2012-12-01 00:00:00'::timestamp, '2012-11-01 00:00:00'::timestamp)
हमें उम्मीद के मुताबिक 1 महीने का समय देगा। तो आइए देखें कि क्या हमारे पास महीने के दो आखिरी दिन हैं और इस मामले में अगले दिनों की वापसी आयु अंतराल है। अन्य मामलों में हम मूल मानों का आयु अंतराल लौटाएंगे:
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 $$;
कुछ उदाहरण:
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)