首页 > 解决方案 > python 的 psycopg2 包和 dbeaver 客户端在执行相同的查询时返回不同的结果。这是 psycopg2 的已知问题吗?

问题描述

我有一个看起来像这样的查询

select count(*)
from table
where created_at<TIMESTAMP '2019-10-18 06:14:33'

在 python 中运行时返回 1262,在 dbeaver 中运行时返回 1118。正确的数字是 1118。是否有任何原因导致对语句的处理方式不同?这是 psycopg2 的已知错误吗?

标签: pythonsqlpostgresqlpsycopg2

解决方案


有同样的问题。我有更复杂的查询,但问题是一样的。数据库的细节无关紧要,只要您使用日期操作就足够了,结果会有所不同。我确定这是关于时区的。当 Python 试图执行时,他以某种方式将其转换为与客户端不同的时区

这里提出了类似的问题:python 脚本不断将日期转换为 utc

更新:所以问题已经解决了您应该在双方都定义要使用的时区。当您将 PosgreSQL 客户端用作 DBeaver 时,他使用的是定义的 DB 时区

SELECT * 
FROM pg_timezone_names 
WHERE name = current_setting('TIMEZONE');

所以这简化了我的查询:

    select count(id) 
    from realestates_realestate
    where create_date::date = now()::date – 1

应该是这样的:

    select count(id) 
    from realestates_realestate
    where (create_date AT TIME ZONE 'CET')::date = (now() AT TIME ZONE 'CET')::date – 1

在这种情况下,结果将是相同的,因为 Python 在不同的时区执行查询(在我看来,在 UTC 时区)。当您在 SQL 中定义使用哪个时区时,问题就解决了。


推荐阅读