Re: PGparam timestamp question - Mailing list pgsql-hackers

From Robert Treat
Subject Re: PGparam timestamp question
Date
Msg-id 200712091126.44198.xzilla@users.sourceforge.net
Whole thread Raw
In response to PGparam timestamp question  (Andrew Chernow <ac@esilo.com>)
Responses Re: PGparam timestamp question  (Andrew Chernow <ac@esilo.com>)
List pgsql-hackers
On Sunday 09 December 2007 09:44, Andrew Chernow wrote:
> I am trying to add support for timestamps in our proposed libpq PGparam
> patch. I ran into something I don't really understand.  I wasn't sure if it
> was my libpq code that was wrong (converts a binary timestamp into a time_t
> or struct tm) so I tried it from psql.
>
> Server is using EST (8.3devel) x86_64 centos 5
>
> TIMESTAMP WITHOUT TIME ZONE appears to be incorrectly adjusting the time.
>
> postgres=# create table t (ts timestamp);
> postgres=# insert into t values (now());
> postgres=# select * from t;
>               ts
> ----------------------------
>   2007-12-09 08:00:00.056244
>
> postgres=# select ts at time zone 'UTC' from t;
>             timezone
> -------------------------------
>   2007-12-09 03:00:00.056244-05  ====> Shouldn't this be 13:00
>

No. 8 AM UTC is 3 AM Eastern. 

>
> TIMESTAMP WITH TIME ZONE returns the result I would expect.
>
> postgres=# create table t (ts timestamp with time zone);
> postgres=# insert into t values (now());
> postgres=# select * from t;
>               ts
> ----------------------------
>   2007-12-09 08:00:00.056244
>
> postgres=# select ts at time zone 'UTC' from t;
>             timezone
> -------------------------------
>   2007-12-09 13:00:00.056244-05
>

Correspondingly, 8 AM eastern is 1 PM UTC. 

>
> Is this expected/desired behavior?  If it is, how are timestamps stored
> internally for WITHOUT TIME ZONE types?  The docs don't really say.  They
> do discuss how WITH TIME ZONE stores things, but WITHOUT is a little blury.
>  Maybe I am missing something simple.
>

When timestamptzs are converted to timestamp, there is no time adjust, you 
simply lose the tz offset information:

pagila=# select now(), now()::timestamp;
-[ RECORD 1 ]----------------------
now | 2007-12-09 11:25:52.923612-05
now | 2007-12-09 11:25:52.923612

If you store without timezone, you lose the original timezone information, so 
selecting out "with time zone"  simply selects the stored time in the time 
zone you selected.  HTH. 

-- 
Robert Treat
Build A Brighter LAMP :: Linux Apache {middleware} PostgreSQL


pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Release Note Changes
Next
From: Robert Treat
Date:
Subject: whats the deal with -u ?