Re: interval output format available that removes ambiguity ?

From: Bruno Wolff III <bruno(at)wolff(dot)to>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: interval output format available that removes ambiguity ?
Date: 2004-05-04 22:42:42
Message-ID: 20040504224242.GA13720@wolff.to
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Tue, May 04, 2004 at 22:59:34 +0200,
Karsten Hilbert <Karsten(dot)Hilbert(at)gmx(dot)net> wrote:
> Are you saying that when PostgreSQL returns "... 3 mons ..."
> as a representation of an interval I can safely assume that
> when it calculated the number of months it used 30 days
> regardless of the actual length of the month ? I couldn't find

It only does this when there is no month to know the length of.
Offhand the only way I know of to get this is to extract the
epoch part of a month which combines the month/year part of the interval
with the week/day/hour/minute/second part without knowing which particular
months are being referred to.

> that number mentioned anywhere and had not browsed the source
> yet. That would also be contrary to what I thought. I assumed
> the following would happen:
>
> select age('1999-2-2', '1999-3-2');
> select age('1999-5-2', '1999-6-2');
>
> would both return "1 mon" (despite the first one being 28 days
> and the second one being 31 days).

No it doesn't do that. In those examples it knows what particular months
are involved and can use the correct length.

> I am now looking for a way to say:
>
> select age('1999-2-2', '1999-3-2', without months);
> select age('1999-5-2', '1999-6-2', without months);
>
> and get "28 days" in the first and "31 days" in the second
> result.

select '1999-3-2'::date - '1999-2-2'::date;
select '1999-6-2'::date - '1999-5-2'::date;

>
> However, if you say that "1 mon" is always considered 30 days
> in this context I would expect to receive:

That isn't what I said and that isn't what happens.

>
> 1) "1 mon -2 days" (it would return 28 days of course, I know)
> 2) "1 mon 1 day"
>
> Neither 7.1 nor 7.4 return that.
>
> > You can extract "epoch" from the interval to get the total number of
> > seconds in the interval (converting months to the number of seconds
> > in 30 days) and then divide that by the appropiate amount.
> That only works if the above holds true, eg the month must be
> fixed to 30 days by the calculation *generating* the interval
> representation. Applying epoch *after* the fact is no good,
> does it, because the epoch() code won't know whether "1 mons"
> is to be 28 or 29 or 30 or 31 days.

Not exactly. Months are converted to 30 days in the above situation, but
not always.

> Am I missing something here ?

Note that intervals store two different values in them. One is a time in
months and another is in some multiple (possibly 1) of seconds. Often one
or the other of these is zero, but not always.

In response to

Browse pgsql-general by date

  From Date Subject
Next Message David Roche 2004-05-05 00:06:55 How to abort psql when backtick (shell) commands return non-zero?
Previous Message Karsten Hilbert 2004-05-04 20:59:34 Re: interval output format available that removes ambiguity ?