2

我有一个 python 脚本,可以将每小时读数插入到 postgres 数据库中。它在 2010 年 3 月 28 日失败。postgres 如何将 01:00:00 和 02:00:00 解释为 02:00:00。我做错了什么(ps:适用于在此之前的其他日期)

 select to_timestamp('28/03/2010 01:00:00','DD/MM/YYYY HH24:MI:SS');
      to_timestamp
------------------------
 2010-03-28 02:00:00+01
(1 row)

select to_timestamp('28/03/2010 02:00:00','DD/MM/YYYY HH24:MI:SS');
      to_timestamp
------------------------
 2010-03-28 02:00:00+01
(1 row)
4

2 回答 2

0

我究竟做错了什么?

没有错。

正如 a_horse_with_no_name 所评论的,您所看到的是夏令时的效果。在欧洲中部时间 3 月 28 日凌晨 2 点,时钟跳过一小时,直接转到凌晨 3 点。我假设您的时区是UTC+01,所以您在凌晨 1 点 > 凌晨 2 点看到这个。

那一天只有 23 小时:两个日期确实代表相同的时间点,这就是您在to_timestamp().

提取对应的epochs,还可以看到结果是一样的:

select 
    to_timestamp('28/03/2010 01:00:00','DD/MM/YYYY HH24:MI:SS') "1 AM",
    to_timestamp('28/03/2010 02:00:00','DD/MM/YYYY HH24:MI:SS') "2 AM",
    extract(epoch from to_timestamp('28/03/2010 01:00:00','DD/MM/YYYY HH24:MI:SS')) "1 AM epoch",
    extract(epoch from to_timestamp('28/03/2010 02:00:00','DD/MM/YYYY HH24:MI:SS')) "2 AM epoch"
凌晨 1 点 | 凌晨 2 点 | 凌晨 1 点时代 | 凌晨 2 点
:--------------------- | :--------------------- | :--------- | :---------
2010-03-28 02:00:00+01 | 2010-03-28 02:00:00+01 | 1269738000 | 1269738000

这只是处理日期时涉及的众多技巧之一。从 Postgres 的角度来看,您对此无能为力:由您的应用程序来处理它。

于 2020-04-05T16:52:03.263 回答
0

恐怕我不同意你没有做错什么的说法。

如果您的数据库时区设置为在 2010 年 3 月 28 日 01:00 更改为夏令时的时区,例如“欧洲/伦敦”,那么您不应该尝试为两个 01:00:00 创建记录和 2010 年 3 月 28 日的 02:00:00,因为 01:00:00 不存在(时间从 00:59:59 跳到 02:00:00)。

如果您不打算遵循夏令时,那么您需要将数据库服务器时区更改为不遵循夏令时的时区,例如“GMT”或“UTC”。

于 2020-05-22T17:42:34.787 回答