Re: Yet Another Timestamp Question: Time Defaults

From: Steve Crawford <scrawford(at)pinpointresearch(dot)com>
To: Gavan Schneider <pg-gts(at)snkmail(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Yet Another Timestamp Question: Time Defaults
Date: 2013-01-22 17:04:13
Message-ID: 50FEC68D.4020803@pinpointresearch.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 01/21/2013 08:56 PM, Gavan Schneider wrote:
> On Monday, January 21, 2013 at 10:53, Steve Crawford wrote:
>
>> On 01/21/2013 02:48 PM, Gavan Schneider wrote:
>>> ....
>>> Taking another tangent I would much prefer the default time to be
>>> 12:00:00 for the conversion of a date to timestamp(+/-timezone).
>>>
>>> Propose: '2013-12-25'::timestamp ==> 2013-12-25 12:00:00
>>>
>>> The benefit of the midday point is that the actual date will not
>>> change when going through the timezone conversion.
>>
>> Just like it doesn't change now? (I just checked against all of the
>> more than 1,100 zones in PG without seeing a problem.)
>>
> I find this result strange to say the least... our conversation is
> straddling Monday(you)/Tuesday(me). We shared the time point
> 2013-01-22 01:30 UTC, but called it different things, viz., 2013-01-22
> 12:30 and 2013-01-21 17:30.

We can call it all sorts of things but it is, in fact, the same point in
time. What you have done is omitted a critical piece of information
necessary for a "fully qualified" point-in-time - the time zone.

Now if I tell my wife I'll be home by 6 she says, "OK, see you then,"
not "do you mean AM or PM? Er, Pacific time? Today?" In other words she
makes reasonable assumptions about what point-in-time I am conveying.

(Aside...It reminds me of the joke about the father admonishing his
daughter's date to have her back by ten-fifteen to which he responds,
"Mid-October? Cool!")

A date alone can be interpreted as any of a number of points-in-time
covering a roughly two-day range:

select '2013-01-22 23:59 posix/Pacific/Midway'::timestamptz -
'2013-01-22 00:00 Pacific/Kiritimati'::timestamptz;

1 day 01:00:00

So in order to calculate a single point-in-time, PostgreSQL, like my
wife, has to make certain assumptions regarding the missing information
(and fortunately PostgreSQL follows the SQL spec in this regard). The
assumptions it makes are:

1) Interpret the date in local time not the date somewhere else in the
world.

2) Interpret the missing time portion as 00:00:00.

You now have a point-in-time, not a date. You can display that
point-in-time in whatever timezone you wish and some will have the same
date as your local date while others will not. Assuming that the time is
12:00:00 rather than 00:00:00 does not change that fact:

--localtime is US Pacific
select '2013-01-22 12:00'::timestamptz at time zone 'Pacific/Kiritimati';

2013-01-23 10:00:00

Cheers,
Steve

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Cliff de Carteret 2013-01-22 17:23:26 Re: Pg_xlog increase due to postgres crash (disk full)
Previous Message Kevin Grittner 2013-01-22 16:43:51 Re: Pg_xlog increase due to postgres crash (disk full)