小编JTS*_*man的帖子

PostgreSQL 9.2 JDBC驱动程序使用客户端时区?

我使用PostgreSQL数据库和PostgreSQL JDBC驱动程序遇到了一个有趣的挑战.似乎最新版本的驱动程序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"
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

结果使用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
Run Code Online (Sandbox Code Playgroud)

这导致查询中的WHERE语句返回不正确的结果.例如,

WHERE end_time between now() - interval '1 hour' and now()
Run Code Online (Sandbox Code Playgroud)

使用9,0驱动程序按预期工作,但使用9,2驱动程序返回无结果,因为驱动程序似乎偏移了end_time的值以匹配UTC(客户端的时区).以下是一种解决方法,但是一个丑陋的方法:

WHERE end_time at time zone 'EDT' between now() - interval '1 hour' and now()
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 有没有其他人遇到过这个?
  2. 这种行为改变是否有解释?我在JDBC发行说明中找不到任何内容
  3. 除了将驱动程序回滚到旧版本之外,有关如何解决此问题的任何建议吗?

谢谢!

postgresql timezone jdbc

19
推荐指数
2
解决办法
1万
查看次数

标签 统计

jdbc ×1

postgresql ×1

timezone ×1