【问题标题】:Postgres to_timestamp functionPostgres to_timestamp 函数
【发布时间】:2020-07-17 13:48:49
【问题描述】:

我有一个 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)

【问题讨论】:

  • 我无法在 postgresql 12 中重现此行为。我建议您将两个选择折叠成一个并检查输出(select to_timestamp('28/03/2010 01:00:00','DD/MM/YYYY HH24:MI:SS') one, to_timestamp('28/03/2010 02:00:00','DD/MM/YYYY HH24:MI:SS') two, version() v;)。该查询还会告知您正在运行的 postgresql 版本。
  • 您的服务器在哪个时区?它可能与 DST 切换有关(尽管这发生在 02:00,而不是在 01:00

标签: sql postgresql date select to-timestamp


【解决方案1】:

我做错了什么?

没有错。

正如 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 的角度来看,您对此无能为力:由您的应用程序来处理。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      相关资源
      最近更新 更多