Обсуждение: Timezone error when casting. Maybe daylight saving

Поиск
Список
Период
Сортировка

Timezone error when casting. Maybe daylight saving

От
Kjetil Nygård
Дата:
I try to build with the tests, but when I run the test
org.postgresql.test.jdbc2.StatementTest.testDateFunctions() i get:
junit.framework.AssertionFailedError: expected:<-3> but was:<-2>


When I run the same function directly in PostgreSQL, I also get -2:

test=> select extract( day from ((CAST(-3 || ' day' as
interval)+now())-now()));
 date_part
-----------
        -2


When I remove the extract day from the expression, I get:
test=> select  CAST(-3 || ' day' as interval)+now()-now();
     ?column?
-------------------
 -2 days -23:00:00


Also note these two:

test=> select '3 day'::interval + now();
           ?column?
-------------------------------
 2014-04-04 22:13:36.144756+02

test=> select  (CAST(-3 || ' days' as interval)+now());
           ?column?
-------------------------------
 2014-03-29 22:13:38.880739+01


Which should give the same timezone, but they are in +01 and +02.

This seems like a timezone problem, but I do not yet fully understand
why. My timezone is "Europe/Oslo". My PostgreSQL version is 9.3.4, from
PostgreSQL's YUM-repo.


PS: I sent this to both bugs and pgjdbc as it is a bug in PostgreSQL and
affects pgjdbc.


Regards,

Kjetil Nygård
Phone: +47 41 47 43 37





Re: Timezone error when casting. Maybe daylight saving

От
Dave Cramer
Дата:
Not sure what this has to do with JDBC ?

Dave Cramer

dave.cramer(at)credativ(dot)ca
http://www.credativ.ca


On Tue, Apr 1, 2014 at 4:18 PM, Kjetil Nygård <polpot78@gmail.com> wrote:

I try to build with the tests, but when I run the test
org.postgresql.test.jdbc2.StatementTest.testDateFunctions() i get:
junit.framework.AssertionFailedError: expected:<-3> but was:<-2>


When I run the same function directly in PostgreSQL, I also get -2:

test=> select extract( day from ((CAST(-3 || ' day' as
interval)+now())-now()));
 date_part
-----------
        -2


When I remove the extract day from the expression, I get:
test=> select  CAST(-3 || ' day' as interval)+now()-now();
     ?column?
-------------------
 -2 days -23:00:00


Also note these two:

test=> select '3 day'::interval + now();
           ?column?
-------------------------------
 2014-04-04 22:13:36.144756+02

test=> select  (CAST(-3 || ' days' as interval)+now());
           ?column?
-------------------------------
 2014-03-29 22:13:38.880739+01


Which should give the same timezone, but they are in +01 and +02.

This seems like a timezone problem, but I do not yet fully understand
why. My timezone is "Europe/Oslo". My PostgreSQL version is 9.3.4, from
PostgreSQL's YUM-repo.


PS: I sent this to both bugs and pgjdbc as it is a bug in PostgreSQL and
affects pgjdbc.


Regards,

Kjetil Nygård
Phone: +47 41 47 43 37





--
Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-jdbc

Re: Timezone error when casting. Maybe daylight saving

От
Kjetil Nygård
Дата:

Only that it breaks a test in pgjdbc project.

But the real bug is in PostgreSQL.

1. apr. 2014 22:44 skrev "Dave Cramer" <pg@fastcrypt.com> følgende:
Not sure what this has to do with JDBC ?

Dave Cramer

dave.cramer(at)credativ(dot)ca
http://www.credativ.ca


On Tue, Apr 1, 2014 at 4:18 PM, Kjetil Nygård <polpot78@gmail.com> wrote:

I try to build with the tests, but when I run the test
org.postgresql.test.jdbc2.StatementTest.testDateFunctions() i get:
junit.framework.AssertionFailedError: expected:<-3> but was:<-2>


When I run the same function directly in PostgreSQL, I also get -2:

test=> select extract( day from ((CAST(-3 || ' day' as
interval)+now())-now()));
 date_part
-----------
        -2


When I remove the extract day from the expression, I get:
test=> select  CAST(-3 || ' day' as interval)+now()-now();
     ?column?
-------------------
 -2 days -23:00:00


Also note these two:

test=> select '3 day'::interval + now();
           ?column?
-------------------------------
 2014-04-04 22:13:36.144756+02

test=> select  (CAST(-3 || ' days' as interval)+now());
           ?column?
-------------------------------
 2014-03-29 22:13:38.880739+01


Which should give the same timezone, but they are in +01 and +02.

This seems like a timezone problem, but I do not yet fully understand
why. My timezone is "Europe/Oslo". My PostgreSQL version is 9.3.4, from
PostgreSQL's YUM-repo.


PS: I sent this to both bugs and pgjdbc as it is a bug in PostgreSQL and
affects pgjdbc.


Regards,

Kjetil Nygård
Phone: +47 41 47 43 37





--
Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-jdbc

Re: [BUGS] Timezone error when casting. Maybe daylight saving

От
Tom Lane
Дата:
Kjetil =?ISO-8859-1?Q?Nyg=E5rd?= <polpot78@gmail.com> writes:
> I try to build with the tests, but when I run the test
> org.postgresql.test.jdbc2.StatementTest.testDateFunctions() i get:
> junit.framework.AssertionFailedError: expected:<-3> but was:<-2>

> When I run the same function directly in PostgreSQL, I also get -2:

> test=> select extract( day from ((CAST(-3 || ' day' as
> interval)+now())-now()));
>  date_part
> -----------
>         -2

I get -3 ... unless I set my timezone to Europe/Oslo.  I'm guessing
that you had a daylight savings transition this past weekend?  If so,
the issue is that the query gives a different answer for a couple
of days after a transition, as a consequence of the fact that adding
'1 day' to a timestamp is not the same as adding '24 hours'.

We used to have issues of this sort with the core regression tests;
they'd fail predictably for a couple of days in spring and fall.
Eventually we changed all the test cases to not hit the boundary
condition ... which is arguably a loss of test coverage, but it
wasn't worth the hassle of having unstable regression test results.
It sounds like JDBC's test cases still have the issue.

            regards, tom lane


Re: [BUGS] Timezone error when casting. Maybe daylight saving

От
Michael Paquier
Дата:
On Wed, Apr 2, 2014 at 7:43 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Kjetil =?ISO-8859-1?Q?Nyg=E5rd?= <polpot78@gmail.com> writes:
>> I try to build with the tests, but when I run the test
>> org.postgresql.test.jdbc2.StatementTest.testDateFunctions() i get:
>> junit.framework.AssertionFailedError: expected:<-3> but was:<-2>
>
>> When I run the same function directly in PostgreSQL, I also get -2:
>
>> test=> select extract( day from ((CAST(-3 || ' day' as
>> interval)+now())-now()));
>>  date_part
>> -----------
>>         -2
>
> I get -3 ... unless I set my timezone to Europe/Oslo.  I'm guessing
> that you had a daylight savings transition this past weekend?  If so,
> the issue is that the query gives a different answer for a couple
> of days after a transition, as a consequence of the fact that adding
> '1 day' to a timestamp is not the same as adding '24 hours'.
>
> We used to have issues of this sort with the core regression tests;
> they'd fail predictably for a couple of days in spring and fall.
> Eventually we changed all the test cases to not hit the boundary
> condition ... which is arguably a loss of test coverage, but it
> wasn't worth the hassle of having unstable regression test results.
> It sounds like JDBC's test cases still have the issue.
The same question gets asked from time to time...
http://www.postgresql.org/message-id/17307.1021949260@sss.pgh.pa.us
http://www.postgresql.org/message-id/21758.1363108146@sss.pgh.pa.us
--
Michael