【问题标题】:PostgreSQL: Add timezone to columns without converting the timesPostgreSQL:将时区添加到列而不转换时间
【发布时间】:2021-02-10 15:30:00
【问题描述】:

我有一张表,里面有几个时间戳列,基本如下:

         timestamp_utc        |          timestamp
------------------------------------------------------------
'2020-10-28 08:00:00.000'     | '2020-10-28 04:00:00.000'

我知道第一列是 UTC 时间,而第二列是纽约时间。我想知道如何添加相应的时区。所以我想要的结果是这样的:

         timestamp_utc        |          timestamp
------------------------------------------------------------
'2020-10-28 08:00:00.000Z'     | '2020-10-28 04:00:00.000-04'

我尝试过这样做:

>>> select timestamp_utc AT TIME ZONE 'UTC' from table;

'2020-10-28 04:00:00.000-04' /* wrong */
>>> select timestamp AT TIME ZONE 'EST' from table;

'2020-10-28 05:00:00.000-04' /* wrong, it should be 04:00:00 */

所以终于在纽约部分尝试了这个:

>>> select timestamp_est AT TIME ZONE 'America/New_York' from table;

'2020-10-28 04:00:00.000-04' 

所以我认为当我添加带有位置的时区时,它可以工作。但是,当我尝试使用真正的时区时,除了添加时区之外,它还在转换时间?

【问题讨论】:

  • timestamp_utc 和 timestamp 列的类型是什么(仅供参考,我会重命名它,或者您是否使用 timestamp_est)?服务器的TimeZone 设置是什么?
  • 列名只是虚拟的例子,所以如果它被称为时间戳也不用担心。 TimeZone 是 Est,但我无法更改服务器时区。通过使用 Python 而不是 PG 来解决它。正如@Laurenz Albe 所说,可能无法在 PG 中完成
  • 我会在文档中查看这部分 Time Zones。它将帮助您了解正在发生的事情。提示您的 TimeZone 未设置为 EST。第二个EST 实际上只是一个偏移量而不是一个完整的时区,因此您的转换会出错。最后,您将值存储为什么数据类型,timestamp 与 timestamptz 很重要。我一直在 Python 中使用dateutil,但它仍然取决于数据库中的底层行为。

标签: postgresql datetime timezone timestamp-with-timezone


【解决方案1】:

您不能这样做,因为 PostgreSQL(与直觉相反)不会将时区与 timestamp with time zone 一起存储。此数据类型在内部存储为 UTC,在显示时根据timezone 参数的当前设置进行转换。

所以有两种方法可以用时间戳存储时区偏移量:

  1. 添加一个新列 timezone,其中包含作为字符串 (Europe/Vienna) 或数字 (2) 的时区。

  2. 将时间戳存储为字符串。这通常是个坏主意。

【讨论】:

  • 我会告诫不要存储时区偏移量 (2)。因为这不会在适当的时区名称中考虑夏令时(夏令时)调整。
  • @Belayer 我同意。我只是提供了使用数字偏移量的可能性,因为这似乎是 OP 所要求的。
猜你喜欢
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2017-01-16
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多