我在使用带有 PostgreSQL JDBC 驱动程序的 PostgreSQL 数据库时遇到了一个有趣的挑战。似乎最新版本的驱动程序 9.2 在执行日期/时间匹配时使用客户端时区。
当服务器(JasperReports 服务器)设置为 UTC 并且数据库服务器设置为美国/东部时,这将成为一个问题。
如果我从设置为 UTC 时区的客户端运行以下查询,我会使用 9.0 JDBC 驱动程序和 9.2 JDBC 驱动程序得到不同的结果。
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 发行说明中找不到任何内容
- 除了将驱动程序回滚到旧版本之外,有关如何解决此问题的任何建议?
谢谢!