BUG #5325: Timestamp w/ timezone + interval not functioning correctly

From: "Eric Vollnogel" <edvollnogel(at)dstsystems(dot)com>
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #5325: Timestamp w/ timezone + interval not functioning correctly
Date: 2010-02-12 19:55:22
Message-ID: 201002121955.o1CJtMTb075872@wwwmaster.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs


The following bug has been logged online:

Bug reference: 5325
Logged by: Eric Vollnogel
Email address: edvollnogel(at)dstsystems(dot)com
PostgreSQL version: 8.4.2
Operating system: Windows XP
Description: Timestamp w/ timezone + interval not functioning
correctly
Details:

I have encountered a problem in which adding a timestamp with timezone to a
duration is resulting in an incorrect timestamp with timezone depending on
if the duration causes the sum to cross a daylight savings boundary.

For example, the following query shows a calculation without crossing a
daylight savings boundary:

SELECT cast('2010-03-01 00:00:00' AS timestamp without time zone) AT TIME
ZONE 'US/Eastern' AS timestamp1, cast('2010-03-02 00:00:00' AS timestamp
without time zone) AT TIME ZONE 'US/Eastern' AS timestamp2, cast('2010-03-02
00:00:00' AS timestamp without time zone) AT TIME ZONE 'US/Eastern' -
cast('2010-03-01 00:00:00' AS timestamp without time zone) AT TIME ZONE
'US/Eastern' as interval, (cast('2010-03-02 00:00:00' AS timestamp without
time zone) AT TIME ZONE 'US/Eastern' - cast('2010-03-01 00:00:00' AS
timestamp without time zone) AT TIME ZONE 'US/Eastern') + (cast('2010-03-01
00:00:00' AS timestamp without time zone) AT TIME ZONE 'US/Eastern') as
shouldbetimestamp1

Results in the following output:

timestamp1, timestamp2, interval, shouldbetimestamp1
"2010-02-28 23:00:00-06";"2010-03-01 23:00:00-06";"1 day";"2010-03-01
23:00:00-06"

This output is correct. The output shows timestamp1, timestamp2,
timestamp2-timestamp1, and (timestamp2-timestamp1)+timestamp1. timestamp2
should always be equal to (timestamp2-timestamp1)+timestamp1.

For the next example, we cross the daylight savings time boundary:

SELECT cast('2010-03-01 00:00:00' AS timestamp without time zone) AT TIME
ZONE 'US/Eastern' AS timestamp1, cast('2010-04-15 00:00:00' AS timestamp
without time zone) AT TIME ZONE 'US/Eastern' AS timestamp2, cast('2010-04-15
00:00:00' AS timestamp without time zone) AT TIME ZONE 'US/Eastern' -
cast('2010-03-01 00:00:00' AS timestamp without time zone) AT TIME ZONE
'US/Eastern' as interval, (cast('2010-04-15 00:00:00' AS timestamp without
time zone) AT TIME ZONE 'US/Eastern' - cast('2010-03-01 00:00:00' AS
timestamp without time zone) AT TIME ZONE 'US/Eastern') + (cast('2010-03-01
00:00:00' AS timestamp without time zone) AT TIME ZONE 'US/Eastern') as
shouldbetimestamp1

This results in the following output:

timestamp1, timestamp2, interval, shouldbetimestamp1
"2010-02-28 23:00:00-06";"2010-04-14 23:00:00-05";"44 days
23:00:00";"2010-04-14 22:00:00-05"

The output in this example is incorrect. Because 1 hour is lost when
daylight savings takes effect, the interval is correct: 45 days - 1 hour.
(44 days 23:00:00). However the last computation,
(timestamp2-timestamp1)+timestamp1 should equal timestamp2, but clearly does
not.

2010-04-14 23:00:00-05 does not equal 2010-04-14 22:00:00-05.

Thank you for your assistance in this matter,

ERIC

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2010-02-13 00:14:49 Re: BUG #5325: Timestamp w/ timezone + interval not functioning correctly
Previous Message Robert Haas 2010-02-12 18:02:45 Re: BUG #5324: Server not starting