Я столкнулся с интересной задачей, используя базу данных PostgreSQL с драйвером JDBC PostgreSQL. Похоже, что последняя версия драйвера 9.2 использует часовой пояс клиента при выполнении совпадений даты/времени.
Это становится проблемой, когда сервер (сервер JasperReports) установлен в UTC, а сервер базы данных установлен в US/Eastern.
Если я запустил следующий запрос от клиента, установленного в часовой пояс UTC, я получаю разные результаты, используя драйвер 9.0 JDBC и драйвер JDBC 9.2.
select now(), extract(timezone FROM now()), current_setting('TIMEZONE'), now()-interval '1 hour' as "1HourAgo"
Результаты с использованием драйвера 9.0 JDBC:
now date_part current_setting 1HourAgo
2013-08-26 15:33:57.590089 -14,400 US/Eastern 2013-08-26 14:33:57.590089
Результаты с использованием 9.2 драйвера JDBC:
now date_part current_setting 1HourAgo
2013-08-26 15:41:49.067903 0 UTC 2013-08-26 14:41:49.067903
Это приводит к тому, что оператор запроса WHERE в запросе возвращает неверные результаты. Например,
WHERE end_time between now() - interval '1 hour' and now()
работает как ожидалось, используя драйвер 9,0, но не возвращает результаты с использованием драйвера 9,2, поскольку драйвер, как представляется, компенсирует значение end_time для соответствия UTC (часовой пояс клиента). Ниже приведено обходное решение, но уродливое:
WHERE end_time at time zone 'EDT' between now() - interval '1 hour' and now()
Вопросы:
- Кто-нибудь еще сталкивается с этим раньше?
- Есть ли объяснение этого изменения в поведении? Я не смог найти что-либо в примечаниях к выпуску JDBC.
- Любые советы о том, как обойти это, кроме отката драйвера к более старой версии?
Спасибо!