PostgreSQL 转换 timestamptz
PostgreSQL Convert timestamptz
我将时间戳存储在数据类型为 timestamp with time zone
的 PostgreSQL table 中。我知道它们实际上是用 UTC 存储的,但数据库设置为美国中部 (CST / CDT)。所有记录最初都不是美国中部时间戳 - 有些来自美国其他时区。查询时,我想根据城市确定正确的原始时区,并将时间戳转换回源时区。这部分通过一组手动创建的查找 tables.
来解决
我坚持的是知道何时转换为 标准 与 日光 版本的时区。在美国,标准 -> 夏令时在 3 月的第二个星期日 0200 时(立即变为 0300)。在 11 月的第一个星期日,日光 -> 标准在 0200,立即变为 0100。第一个转换很容易 (date > spring_forward
& hour > 2
)。
但是,第二次转换很困难,因为那天 0100 基本上有 2 条记录; CDT 的第一个 0100,然后是 CST 的第二个(后退)0100。显然,我想将重复的 0100 转换为标准,而不是第一个,但我不确定如何在没有一些复杂的计数查询的情况下执行此操作。这个问题似乎已经在 python 和 "generic" 时区中得到解决,例如 "Pacific" 包含 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
。
我将时间戳存储在数据类型为 timestamp with time zone
的 PostgreSQL table 中。我知道它们实际上是用 UTC 存储的,但数据库设置为美国中部 (CST / CDT)。所有记录最初都不是美国中部时间戳 - 有些来自美国其他时区。查询时,我想根据城市确定正确的原始时区,并将时间戳转换回源时区。这部分通过一组手动创建的查找 tables.
我坚持的是知道何时转换为 标准 与 日光 版本的时区。在美国,标准 -> 夏令时在 3 月的第二个星期日 0200 时(立即变为 0300)。在 11 月的第一个星期日,日光 -> 标准在 0200,立即变为 0100。第一个转换很容易 (date > spring_forward
& hour > 2
)。
但是,第二次转换很困难,因为那天 0100 基本上有 2 条记录; CDT 的第一个 0100,然后是 CST 的第二个(后退)0100。显然,我想将重复的 0100 转换为标准,而不是第一个,但我不确定如何在没有一些复杂的计数查询的情况下执行此操作。这个问题似乎已经在 python 和 "generic" 时区中得到解决,例如 "Pacific" 包含 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
。