PostgreSQL 9.2 JDBC-Treiber verwendet den client Zeit-zone?

Ich habe laufen in eine interessante Herausforderung mit einer PostgreSQL-Datenbank mit der PostgreSQL-JDBC-Treiber. Es scheint, dass die neueste version des Treibers, 9.2, verwendet die client Zeitzone bei der Durchführung Datum/Zeit entspricht.

Dies wird zu einem problem, wenn der server (JasperReports Server) auf UTC eingestellt ist und die Datenbank-server-US/Eastern.

Wenn ich führen Sie die folgende Abfrage von einem client setzen der UTC-Zeitzone, erhalte ich unterschiedliche Ergebnisse mit der 9.0 JDBC-Treiber und die 9.2 JDBC-Treiber.

select now(), extract(timezone FROM now()), current_setting('TIMEZONE'), now()-interval '1 hour' as "1HourAgo"

Ergebnisse mit 9.0 JDBC-Treiber:

now                         date_part   current_setting     1HourAgo
2013-08-26 15:33:57.590089  -14,400     US/Eastern          2013-08-26 14:33:57.590089

Ergebnisse mit 9.2 JDBC-Treiber:

now                         date_part   current_setting     1HourAgo
2013-08-26 15:41:49.067903  0           UTC                 2013-08-26 14:41:49.067903

Dadurch verursacht wird, dass eine WHERE-Anweisung für eine Abfrage falsche Ergebnisse zurück. Zum Beispiel,

WHERE end_time between now() - interval '1 hour' and now()

arbeitet wie erwartet mit der 9,0 Treiber, aber keine Ergebnisse zurückgegeben mit dem 9,2-Treiber, da der Treiber zu sein scheint Aufrechnung den Wert der Endzeit zu entsprechen UTC (Zeitzone des Clients)). Das folgende ist ein workaround, aber eine hässliche:

WHERE end_time at time zone 'EDT' between now() - interval '1 hour' and now()

Fragen:

  1. Hat jemand sonst noch ausführen über das vor?
  2. Gibt es eine Erklärung für diese änderung im Verhalten? Ich habe nicht in der Lage etwas zu finden, in der JDBC-release-notes
  3. Alle Ratschläge, wie dies zu umgehen, andere als die Rollen die Fahrer zurück zu einer älteren version?

Dank!

InformationsquelleAutor JTShyman | 2013-08-26
Schreibe einen Kommentar