PostgreSQL 更新时区偏移量

Posted

技术标签:

【中文标题】PostgreSQL 更新时区偏移量【英文标题】:PostgreSQL update time zone offset 【发布时间】:2011-09-23 11:22:39 【问题描述】:

有什么快速简便的方法可以更正时区TIMESTAMP WITH TIME ZONE 字段意外输入错误的时区?

在我的情况下,以下记录被错误地输入为 UTC 而不是美国/太平洋:

           t0           |           t1           |     what
------------------------+------------------------+---------------
 2011-06-01 13:00:00+00 | 2011-06-01 13:10:00+00 | recalibrating
 2011-06-01 13:10:00+00 | 2011-06-01 13:45:00+00 | verifying
 2011-06-01 13:45:00+00 | 2011-06-01 13:55:00+00 | FAULT

幸运的是,所有错误记录都没有跨越夏令时边界,因此 2 点 UTC 可以简单地纠正为 2 点太平洋。

【问题讨论】:

【参考方案1】:

有强制转换,更重要的是,at time zone 运算符对这类事情很有用,例如:

test=#  select now(),
               now()::timestamp;

              now              |            now             
-------------------------------+----------------------------
 2011-06-27 14:32:04.169292+02 | 2011-06-27 14:32:04.169292
(1 row)

test=# select now() at time zone 'utc',
             (now() at time zone 'utc')::timestamp with time zone;

          timezone          |           timezone            
----------------------------+-------------------------------
 2011-06-27 12:32:28.430479 | 2011-06-27 12:32:28.430479+02
(1 row)

【讨论】:

【参考方案2】:
UPDATE <table>
SET <timestamptz_field> = 
  (<timestamptz_field> AT TIME ZONE 'UTC') AT TIME ZONE '<correct_time_zone>';

【讨论】:

以上是关于PostgreSQL 更新时区偏移量的主要内容,如果未能解决你的问题,请参考以下文章

jdbc PostgreSQL 中的偏移时间(带时区的时间)

在 PostgreSQL timestamptz 类型中保留时区

如何利用PostgreSQL的UTC偏移量获得ISO格式的时间?

Postgres to_timestamp 将时区设置为 +1

PostgreSQL时区调整

如何从时区名称中获取时区偏移量