【问题标题】:PostgreSQL Convert timestamptzPostgreSQL 转换时间戳
【发布时间】:2017-12-19 07:35:00
【问题描述】:

我将时间戳存储在数据类型为 timestamp with time zone 的 PostgreSQL 表中。我知道它们实际上是使用 UTC 存储的,但数据库设置为美国中部 (CST / CDT)。所有记录最初都不是美国中部时间戳——有些来自其他美国时区。查询时,我想根据城市识别正确的原始时区,并将时间戳转换回源时区。这部分是通过一组手动创建的查找表来解决的。

我坚持的是知道何时转换为 标准日光 版本的时区。在美国,标准 -> 3 月第 2 个星期日 0200 时的日光(立即变为 0300)。在 11 月的第一个星期日,Daylight -> Standard 为 0200,立即变​​为 0100。第一次转换很容易 (date > spring_forward & hour > 2)。

但是,第二次转换很困难,因为那天 0100 基本上有 2 条记录; CDT 的第一个 0100,然后 CST 的第二个(后退)0100。显然,我想将重复的 0100 转换为标准,但不是第一个,但我不确定如何在没有一些复杂的计数查询的情况下做到这一点。这个问题似乎已经在具有“通用”时区的 python 中得到解决,例如包含 PST 和 PDT 的“太平洋”。不过,对于 PostgreSQL,我没有看到类似的情况:https://www.postgresql.org/docs/7.2/static/timezones.html

对于时间戳,鉴于我知道原始城市,我一般如何将时区转换为正确的(标准与日光)时区?

【问题讨论】:

  • 我仍然会坚持在时区选择 timestamptz '您的查找表中的区域名称'...

标签: postgresql timezone timestamp-with-timezone


【解决方案1】:

您不必自己担心夏令时,PostgreSQL 拥有所有的智能。使用AT TIME ZONE 语法。

要将timestamp with time zone 转换为芝加哥时间:

SELECT '2017-12-03 00:00:00 UTC' AT TIME ZONE 'America/Chicago';

      timezone       
---------------------
 2017-12-02 18:00:00
(1 row)

结果是timestamp without time zone。如您所见,时间戳已正确转换为夏令时。

您可以在目录视图pg_timezone_names 中找到支持的时区列表。

【讨论】:

  • 我看到这确实有效,尽管文档中没有将“美国/芝加哥”列为时区。能否请您指出这个(和其他)名称的记录位置?
  • 我已将其添加到答案中。
猜你喜欢
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多