PostgreSQL转换timestamptz

问题描述 投票:0回答:1

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

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

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

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

postgresql timezone timestamp-with-timezone
1个回答
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中找到支持的时区列表。

© www.soinside.com 2019 - 2024. All rights reserved.