Re: SELECT and DATE Function question

Lists: pgsql-admin
From: "Mike C" <smith(dot)not(dot)western(at)gmail(dot)com>
To: pgsql-admin(at)postgresql(dot)org
Subject: SELECT and DATE Function question
Date: 2006-09-11 04:53:36
Message-ID: bd0eabd0609102153h71fd59ffv6d0ca8a78c27fd9c@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

Hi,

I'm trying to calculate an expiration date by adding the number of days onto
the start date. i.e. select start_date + number_of_days from blah;

create table blah (start_date timestamp, number_of_days integer);
insert into blah values (current_timestamp, 25);
select start_date + number_of_days from blah;

The error I get is:

ERROR: operator does not exist: timestamp without time zone + integer
HINT: No operator matches the given name and argument type(s). You may need
to add explicit type casts.

But according to
http://www.postgresql.org/docs/8.1/static/functions-datetime.html the +
operator should support integers and treat them as days (date '2001-09-28' +
integer '7'). Obviously typing a constant into the query is a lot different
from using the value of a column, but I would have thought it would work.

What is the correct way to make this calculation?

Cheers,

Mike


From: "Aaron Bono" <postgresql(at)aranya(dot)com>
To: "Mike C" <smith(dot)not(dot)western(at)gmail(dot)com>
Cc: pgsql-admin(at)postgresql(dot)org
Subject: Re: SELECT and DATE Function question
Date: 2006-09-11 05:27:46
Message-ID: bf05e51c0609102227u10e4e4c6j7fcdb06690bb9f5b@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

On 9/10/06, Mike C <smith(dot)not(dot)western(at)gmail(dot)com> wrote:
>
> Hi,
>
> I'm trying to calculate an expiration date by adding the number of days
> onto the start date. i.e. select start_date + number_of_days from blah;
>
> create table blah (start_date timestamp, number_of_days integer);
> insert into blah values (current_timestamp, 25);
> select start_date + number_of_days from blah;
>
> The error I get is:
>
> ERROR: operator does not exist: timestamp without time zone + integer
> HINT: No operator matches the given name and argument type(s). You may
> need to add explicit type casts.
>
> But according to
> http://www.postgresql.org/docs/8.1/static/functions-datetime.html the +
> operator should support integers and treat them as days ( date
> '2001-09-28' + integer '7'). Obviously typing a constant into the query is a
> lot different from using the value of a column, but I would have thought it
> would work.
>
> What is the correct way to make this calculation?
>

Use:

select start_date + (cast(number_of_days as text) || ' days')::interval from
blah

See http://www.postgresql.org/docs/8.1/interactive/functions-datetime.htmlfor
more

==================================================================
Aaron Bono
Aranya Software Technologies, Inc.
http://www.aranya.com
http://codeelixir.com
==================================================================


From: "Mike C" <smith(dot)not(dot)western(at)gmail(dot)com>
To: pgsql-admin(at)postgresql(dot)org
Subject: Re: SELECT and DATE Function question
Date: 2006-09-11 05:34:03
Message-ID: bd0eabd0609102234x5ce6f51by68240306a7083313@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

That works great, thank you!

Mike

On 9/11/06, Aaron Bono <postgresql(at)aranya(dot)com> wrote:
>
> On 9/10/06, Mike C <smith(dot)not(dot)western(at)gmail(dot)com> wrote:
>
> > Hi,
> >
> > I'm trying to calculate an expiration date by adding the number of days
> > onto the start date. i.e. select start_date + number_of_days from blah;
> >
> > create table blah (start_date timestamp, number_of_days integer);
> > insert into blah values (current_timestamp, 25);
> > select start_date + number_of_days from blah;
> >
> > The error I get is:
> >
> > ERROR: operator does not exist: timestamp without time zone + integer
> > HINT: No operator matches the given name and argument type(s). You may
> > need to add explicit type casts.
> >
> > But according to http://www.postgresql.org/docs/8.1/static/functions-datetime.html
> > the + operator should support integers and treat them as days ( date
> > '2001-09-28' + integer '7'). Obviously typing a constant into the query is a
> > lot different from using the value of a column, but I would have thought it
> > would work.
> >
> > What is the correct way to make this calculation?
> >
>
>
> Use:
>
> select start_date + (cast(number_of_days as text) || ' days')::interval
> from blah
>
> See http://www.postgresql.org/docs/8.1/interactive/functions-datetime.htmlfor more
>
> ==================================================================
> Aaron Bono
> Aranya Software Technologies, Inc.
> http://www.aranya.com
> http://codeelixir.com
> ==================================================================
>


From: Jason Topaz <topaz(at)panix(dot)com>
To: Mike C <smith(dot)not(dot)western(at)gmail(dot)com>
Cc: pgsql-admin(at)postgresql(dot)org
Subject: Re: SELECT and DATE Function question
Date: 2006-09-11 07:29:32
Message-ID: 1157959773.2338.5.camel@trane.shiawase.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

On Mon, 2006-09-11 at 16:53 +1200, Mike C wrote:

> create table blah (start_date timestamp, number_of_days integer);
> insert into blah values (current_timestamp, 25);
> select start_date + number_of_days from blah;
>
> The error I get is:
>
> ERROR: operator does not exist: timestamp without time zone + integer
> HINT: No operator matches the given name and argument type(s). You
> may need to add explicit type casts.
>
> But according to
> http://www.postgresql.org/docs/8.1/static/functions-datetime.html the
> + operator should support integers and treat them as days ( date
> '2001-09-28' + integer '7'). Obviously typing a constant into the
> query is a lot different from using the value of a column, but I would
> have thought it would work.

That's because your data type was "timestamp", not "date". I don't
believe the documentation claims the + operator works on a timestamp and
an integer. But it does claim (correctly) that it works on a date and
an integer. The following example does work:

create table blah (start_date date, number_of_days integer);
insert into blah values (current_date, 25);
select start_date + number_of_days from blah;

Hope that helps a little, at least to explain the apparent disconnect
from the documentation.


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: "Aaron Bono" <postgresql(at)aranya(dot)com>
Cc: "Mike C" <smith(dot)not(dot)western(at)gmail(dot)com>, pgsql-admin(at)postgresql(dot)org
Subject: Re: SELECT and DATE Function question
Date: 2006-09-11 14:08:24
Message-ID: 22488.1157983704@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

"Aaron Bono" <postgresql(at)aranya(dot)com> writes:
> Use:

> select start_date + (cast(number_of_days as text) || ' days')::interval from
> blah

This is a pretty awful way to do it, much better is

select start_date + number_of_days * '1 day'::interval ...

which reduces to basically one multiplication instead of conversion to
text, text string append, parse interval string value (relying on a
couple of undocumented cast abilities).

But the real question here is whether you actually want sub-day
precision in your result. Should the column have been 'date' rather
than 'timestamp' to begin with? If not, what behavior are you expecting
at DST boundaries?

regards, tom lane


From: "Aaron Bono" <postgresql(at)aranya(dot)com>
To: "Tom Lane" <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: "Mike C" <smith(dot)not(dot)western(at)gmail(dot)com>, pgsql-admin(at)postgresql(dot)org
Subject: Re: SELECT and DATE Function question
Date: 2006-09-11 15:03:34
Message-ID: bf05e51c0609110803k2e9679d2ma200b00fa10f4651@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

On 9/11/06, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>
> "Aaron Bono" <postgresql(at)aranya(dot)com> writes:
> > Use:
>
> > select start_date + (cast(number_of_days as text) || ' days')::interval
> from
> > blah
>
> This is a pretty awful way to do it, much better is
>
> select start_date + number_of_days * '1 day'::interval ...
>
> which reduces to basically one multiplication instead of conversion to
> text, text string append, parse interval string value (relying on a
> couple of undocumented cast abilities).

I knew there was a better way but I forgot what it was and couldn't find it
in the documentation.

Could the documentation be updated with this example? This question appears
every month or so and I know it is very useful to many people.

Thanks!

==================================================================
Aaron Bono
Aranya Software Technologies, Inc.
http://www.aranya.com
http://codeelixir.com
==================================================================