查询 运行 到 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 启用了日志记录,并且执行的查询是相同的。
注意两件有趣的事情:
- 当我将查询更改为具有
AND t0.custom_attributes IS NULL
时,我在 JDBC 和 PSQL 中返回了预期的 567 条记录。
- 当我删除
t0.time_period @> '2022-04-11 14:21:27.862453'::timestamptz
时,我在 JDBC 和 PSQL 中得到预期的 119 条记录。
关于这里发生的事情有什么想法吗?
我猜问题出在将字符串文字转换为 timestamp with time zone
时。这种类型转换的结果将取决于参数 TimeZone
.
的当前设置
我看到两个补救措施:
通过在您的应用程序中明确设置,确保 TimeZone
始终设置为相同的值
在您的字符串文字中包含时区偏移量,例如
'2022-04-11 14:21:27.862453+00'
我在 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 启用了日志记录,并且执行的查询是相同的。
注意两件有趣的事情:
- 当我将查询更改为具有
AND t0.custom_attributes IS NULL
时,我在 JDBC 和 PSQL 中返回了预期的 567 条记录。 - 当我删除
t0.time_period @> '2022-04-11 14:21:27.862453'::timestamptz
时,我在 JDBC 和 PSQL 中得到预期的 119 条记录。
关于这里发生的事情有什么想法吗?
我猜问题出在将字符串文字转换为 timestamp with time zone
时。这种类型转换的结果将取决于参数 TimeZone
.
我看到两个补救措施:
通过在您的应用程序中明确设置,确保
TimeZone
始终设置为相同的值在您的字符串文字中包含时区偏移量,例如
'2022-04-11 14:21:27.862453+00'