Python 如何将日期与psycopg2(PostgreSQL)进行比较?

Python 如何将日期与psycopg2(PostgreSQL)进行比较?,python,postgresql,datetime,timestamp,psycopg2,Python,Postgresql,Datetime,Timestamp,Psycopg2,通过使用PostgreSQL Python模块psycopg2,我希望找到结束时间早于某个时间戳的行。我尝试使用游标执行此操作。在SQL查询上执行(…),使用…where end_time

通过使用PostgreSQL Python模块psycopg2,我希望找到结束时间早于某个时间戳的行。我尝试使用
游标执行此操作。在SQL查询上执行(…)
,使用
…where end_time<%s
,其中%s替换为带有时区的
datetime.datetime
对象。psycopg2生成的SQL为:

select * from my_table where end_time < '2014-05-01T13:00:00+00:00'::timestamptz;
结束时间不早于2014-05-01 UTC 13:00,与我的预期相反


在psycopg2中执行所需时间选择的正确方式是什么?

指定应显示时间的时区。如果
start\u time
end\u time
是时间戳,没有您的输出建议的时区,那么您还需要告诉postgresql它们应该在哪个时区

select 
    id,
    start_time at time zone 'UTC' at time zone 'UTC',
    end_time at time zone 'UTC' at time zone 'UTC'
from my_table 
where end_time at time zone 'UTC' < %s
选择
身份证件
时区“UTC”的起始时间为时区“UTC”,
在时区“UTC”结束时间在时区“UTC”
从我的桌子上
其中结束时间在时区“UTC”<%s

好的,在表中使用带时区的PostgreSQL时间戳解决了这个问题

以下是有关问题所在的详细信息:

  • 我将时区感知时间戳放在不具有时区感知的列中。我假设不带时区的
    时间戳
    列将包含UTC时间(类似于带时区的
    时间戳
    ),但它实际上包含本地时间的时间戳,如下所述:

    无时区时间戳和有时区时间戳之间的转换 时区通常假定时间戳没有时区值 应被视为或给定为时区本地时间。不同的时区 可以使用在时区为转换指定

    因此,在中国时,00:00 UTC存储为
    08:00
    列中的
    时间戳,不带时区

  • 当进行比较时,比如“没有时区的时间戳”<“有时区的时间戳”,我在文档中找不到PostgreSQL的功能。然而,问题中观察到的情况与首先以相同方式移除时区的想法是一致的,并且比较了没有时区的时间戳。我不应该对结果感到惊讶:在中国,“15:00”的晚时间确实早于UTC 13:00(UTC+8)。关键是要知道显示(和存储)的时间在本地时区


我从中得到的启示是:有时区和没有时区的时间戳之间的转换可以更好地显式处理

您确定时间不会转换为本地时间显示吗?
end\u time
的utc值是多少?我知道这些时间是utc:
select end\u time在时区“utc”…
产生
2014-05-01 23:05:00+08
我引用的返回行中的结束时间。@J.F.Sebastian:Hmmm,我现在知道我没有得到utc值,在我之前的评论中,
select
,但只要求将无时区时间戳视为UTC(在显示在我的本地时区之前)。将带有时区的时间戳放在表中解决了问题,您将重点放在时区上是正确的,这将生成一行,其结束时间为
2014-05-01 23:05:00+08
,因此在UTC 15:05,尽管限制在UTC 13:00。我是否正确理解问题仍然存在?你是对的,这是一个时区问题。但是,此解决方案不起作用,但在时区“UTC”进行双精度测试也会产生一致的(即不出所料的)结果。我只是理解时间是错误的,虽然:最初的时间不是UTC,所以在时区“UTC”
做第一个
,会产生几乎毫无意义的时间……寓意应该是:有趣的链接。如何使用PostgreSQL将数据库时区设置为UTC?感谢您的确认。
select 
    id,
    start_time at time zone 'UTC' at time zone 'UTC',
    end_time at time zone 'UTC' at time zone 'UTC'
from my_table 
where end_time at time zone 'UTC' < %s