在使用PostgreSQL JDBC驱动连接PostgreSQL数据库时,我遇到了一个有趣的挑战。最新版本的驱动程序9.2在执行日期/时间匹配时似乎使用客户端时区。
当服务器(JasperReports Server)设置为UTC而数据库服务器设置为US/Eastern时,就会出现问题。
如果我在一个设置为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发行说明中找不到任何信息。
- 除了将驱动程序回滚到旧版本之外,是否有关于如何解决此问题的建议?
谢谢!
com.mchange.v2.c3p0.ConnectionCustomizer
接口(onAcquire
方法),并设置c3p0.connectionCustomizerClassName
配置属性。 - Emmanuel Guiton