Thread: BUG #4878: function age() give a wrong interval

BUG #4878: function age() give a wrong interval

From
""
Date:
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

Re: BUG #4878: function age() give a wrong interval

From
Frank Heikens
Date:
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

Re: BUG #4878: function age() give a wrong interval

From
"Philippe Amelant"
Date:
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

Re: BUG #4878: function age() give a wrong interval

From
Frank Heikens
Date:
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

Re: BUG #4878: function age() give a wrong interval

From
Tom Lane
Date:
"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