【发布时间】: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