The forth column in this query is returning the wrong value.
The last two columns in this query should return the same value, 5270400 (t=
he number of seconds in 61 days). Using simple subtraction works fine, but =
using the age() function it returns 5184000 seconds (60 days). This same be=
havior can be found using other start/end dates and interval lengths, somet=
imes age() returns too many seconds, sometimes too few. I did not get any f=
ailures below 60 days, but I did not do an exhaustive test of all interval =
values and a range of start/end dates.
> select version();
version
---------------------------------------------------------------------------=
-------------------
PostgreSQL 9.2.6 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.7.=
2-5) 4.7.2, 64-bit
(1 row)
Time: 41.898 ms
> select extract('epoch' from ('2013-12-31'::date) - ('2013-12-31'::d=
ate - '5184000 seconds'::interval)) as right_answer_subtraction_60_days
,extract('epoch' from age (('2013-12-31'::date) , ('2013-12-31'::d=
ate - '5184000 seconds'::interval))) as right_answer_age_60_days
,extract('epoch' from ('2013-12-31'::date) - ('2013-12-31'::d=
ate - '5270400 seconds'::interval)) as right_answer_subtraction_61_days
,extract('epoch' from age (('2013-12-31'::date) , ('2013-12-31'::d=
ate - '5270400 seconds'::interval))) as wrong_answer_age_61_days;
right_answer_subtraction_60_days | right_answer_age_60_days | right_answer=
_subtraction_61_days | wrong_answer_age_61_days
----------------------------------+--------------------------+-------------=
---------------------+--------------------------
5184000 | 5184000 | =
5270400 | 5184000
(1 row)