Thread: BUG #4878: function age() give a wrong interval
The following bug has been logged online: Bug reference: 4878 Logged by: Email address: pamelant@companeo.com PostgreSQL version: 8.2.4, 8.3.6 Operating system: linux Description: function age() give a wrong interval Details: age() report a wrong interval in some case example intervall between the 2 dates is 1008 hours select age('2009-06-23 18:36:05.064066+02' ,'"2009-05-12 18:36:05.064066 +02"') > interval '1000 hours'; result is false instead of true. There is a 24 hours error in the age() results regards
select age( '2009-06-23 18:36:05.064066+02' , '2009-05-12 18:36:05.064066+02') ; Result: "1 mon 11 days" select justify_interval('1000 hours'); Result: "1 mon 11 days 16:00:00" select age( '2009-06-23 18:36:05.064066+02' , '2009-05-12 18:36:05.064066+02') > interval '1000 hours' ; Result: false And that's correct, 1 month and 11 days is less than 1 month, 11 days and 16 hours, it's not more. This is the actual comparison: select interval '1 mon 11 day' > interval '1 mon 11 day 16 hour'; I don't see a problem nor a bug. Regards, Frank Op 25 jun 2009, om 11:28 heeft pamelant@companeo.com het volgende geschreven: > > The following bug has been logged online: > > Bug reference: 4878 > Logged by: > Email address: pamelant@companeo.com > PostgreSQL version: 8.2.4, 8.3.6 > Operating system: linux > Description: function age() give a wrong interval > Details: > > age() report a wrong interval in some case > > example > > intervall between the 2 dates is 1008 hours > > select age('2009-06-23 18:36:05.064066+02' ,'"2009-05-12 > 18:36:05.064066 > +02"') > interval '1000 hours'; > > result is false instead of true. > There is a 24 hours error in the age() results > > regards > > -- > Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-bugs
Le jeudi 25 juin 2009 =C3=A0 11:40 +0200, Frank Heikens a =C3=A9crit : > select > age( > '2009-06-23 18:36:05.064066+02' , > '2009-05-12 18:36:05.064066+02') ; >=20 > Result: "1 mon 11 days" >=20 > select justify_interval('1000 hours'); >=20 > Result: "1 mon 11 days 16:00:00" >=20 > select > age( > '2009-06-23 18:36:05.064066+02' , > '2009-05-12 18:36:05.064066+02') > > interval '1000 hours' > ; >=20 > Result: false >=20 > And that's correct, 1 month and 11 days is less than 1 month, 11 days=20= =20 > and 16 hours, it's not more. This is the actual comparison: >=20 > select interval '1 mon 11 day' > interval '1 mon 11 day 16 hour'; >=20 > I don't see a problem nor a bug. this is wrong because first interval is 1008 hour and the second is 1000 hours In the first case you have a month with 31 days and in the second you have a month with 30 days try this select age(current_timestamp , current_timestamp - '1008 hours'::interval) > interval '1000 hours' so 1000 > 1008=20 regards
The problem is the definition of a month. That can be 28, 29, 30 or 31=20= =20 days. This is what the manual says about age(): age(timestamp, timestamp) interval Subtract arguments, producing a "symbolic" result that uses years and=20=20 months So, it's just a symbolic age, not an exact age. The same occurs with=20=20 years, a year can be 365 days or 366 days. And there are also issues=20=20 with extra seconds and summer and wintertime. time =3D=3D=3D trouble Regards, Frank Op 25 jun 2009, om 12:50 heeft Philippe Amelant het volgende geschreven: > Le jeudi 25 juin 2009 =E0 11:40 +0200, Frank Heikens a =E9crit : >> select >> age( >> '2009-06-23 18:36:05.064066+02' , >> '2009-05-12 18:36:05.064066+02') ; >> >> Result: "1 mon 11 days" >> >> select justify_interval('1000 hours'); >> >> Result: "1 mon 11 days 16:00:00" >> >> select >> age( >> '2009-06-23 18:36:05.064066+02' , >> '2009-05-12 18:36:05.064066+02') >> > interval '1000 hours' >> ; >> >> Result: false >> >> And that's correct, 1 month and 11 days is less than 1 month, 11 days >> and 16 hours, it's not more. This is the actual comparison: >> >> select interval '1 mon 11 day' > interval '1 mon 11 day 16 hour'; >> >> I don't see a problem nor a bug. > > this is wrong because first interval is 1008 hour and the second is=20=20 > 1000 > hours > > In the first case you have a month with 31 days and in the second you > have a month with 30 days > > try this > > select > age(current_timestamp , current_timestamp - '1008 hours'::interval) >> interval '1000 hours' > > so 1000 > 1008 > > regards > > > --=20 > Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-bugs
"Philippe Amelant" <pamelant@companeo.com> writes: > In the first case you have a month with 31 days and in the second you > have a month with 30 days The interval comparisons have no way to know that, so they arbitrarily assume that '1 month' is equivalent to '30 days'. This isn't going to be changed. If you don't like it, don't use age(). A plain old timestamp subtraction will probably provide behavior that's closer to what you want. regards, tom lane