查询 运行 到 JDBC returns 零结果,而 PSQL returns 正确数量

Query ran through JDBC returns zero results while PSQL returns correct amount

我在 PostgreSQL 中查询视图,在 JDBC 和 PSQL 控制台之间得到两个不同的结果。 PSQL 控制台确实包含正确的结果。

这是一个人为的例子来说明正在发生的事情。

想象一下视图如下:

Field Type
id integer
org_id integer
custom_attributes jsonb
time_period tstzrange

正在执行的查询如下:

SELECT
    t0.id
FROM
    profile_view t0
WHERE
    t0.time_period @> '2022-04-11 14:21:27.862453'::timestamptz
    AND t0.org_id = 270
    AND t0.custom_attributes IS NOT NULL;

假设数据库有 119 条具有自定义属性的记录,以及 567 条没有自定义属性的记录。

在 PSQL 中执行时,我会得到 119 条记录,但是当通过 JDBC 执行时,我没有得到任何记录。通过 PostgreSQL 启用了日志记录,并且执行的查询是相同的。

注意两件有趣的事情:

  1. 当我将查询更改为具有 AND t0.custom_attributes IS NULL 时,我在 JDBC 和 PSQL 中返回了预期的 567 条记录。
  2. 当我删除 t0.time_period @> '2022-04-11 14:21:27.862453'::timestamptz 时,我在 JDBC 和 PSQL 中得到预期的 119 条记录。

关于这里发生的事情有什么想法吗?

我猜问题出在将字符串文字转换为 timestamp with time zone 时。这种类型转换的结果将取决于参数 TimeZone.

的当前设置

我看到两个补救措施:

  1. 通过在您的应用程序中明确设置,确保 TimeZone 始终设置为相同的值

  2. 在您的字符串文字中包含时区偏移量,例如

    '2022-04-11 14:21:27.862453+00'