gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:10:01 31 4
gpt4 key购买 nike

我在使用带有 PostgreSQL JDBC 驱动程序的 PostgreSQL 数据库时遇到了一个有趣的挑战。似乎最新版本的驱动程序 9.2 在执行日期/时间匹配时使用客户端时区。

当服务器 (JasperReports Server) 设置为 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()

问题:

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

谢谢!

最佳答案

我自己也遇到过这个问题。我验证了 postgres jdbc 驱动程序确实从 jvm 获取连接时区,但我无法找到覆盖此行为的方法。如果他们为此目的提供一个 jdbc url 连接参数,那就太好了。

作为变通方法,我发现我的连接池库 (HikariCP) 可以为每个新连接执行一条 sql 语句:

hikariConfig.setConnectionInitSql("set time zone 'UTC'");

关于PostgreSQL 9.2 JDBC 驱动程序使用客户端时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18447995/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com