我有时间戳存储在PostgreSQL表中,数据类型为timestamp with time zone
。我知道他们确实存储了UTC,但数据库设置为US Central(CST / CDT)。所有记录最初都不是美国中部时间戳 - 其中一些来自其他美国时区。查询时,我想根据城市确定正确的原始时区,并将时间戳转换回源时区。该部分通过一组手动创建的查找表来解决。
我坚持的是知道何时转换为时区的标准版和日光版。在美国,标准 - >日照在3月的第2个星期日0200(立即变为0300)。在11月的第一个星期天,Daylight - >标准在0200,立即变为0100.第一次过渡很容易(date > spring_forward
和hour > 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拥有所有聪明才智。使用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
中找到支持的时区列表。