PostgreSQL转换timestamptz

时间:2017-12-19 07:35:00

标签: postgresql timezone timestamp-with-timezone

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

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

然而,第二次过渡很难,因为那天0100基本上有2条记录; CDT的第1个0100,然后是CST的第2个(倒退)0100。显然,我想将重复的0100转换为标准,但不是第一,但我不确定如何在没有一些复杂的计数查询的情况下执行此操作。这个问题似乎已经在python中解决了“通用”时区,例如“太平洋”,其中包括PST和&太平洋夏令时。不过,对于PostgreSQL我没有看到这样的内容:https://www.postgresql.org/docs/7.2/static/timezones.html

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

1 个答案:

答案 0 :(得分:0)

你自己不必担心夏令时,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中找到支持的时区列表。