PostgreSQL обновляет смещение часового пояса - PullRequest
10 голосов
/ 27 июня 2011

Какой быстрый и простой способ исправить часовой пояс 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 часа по Гринвичу можно просто исправить как 2 часа по Тихому океану.

Ответы [ 2 ]

14 голосов
/ 27 июня 2011
UPDATE <table> SET <timestamptz_field> = (<timestamptz_field> AT TIME ZONE 'UTC') AT TIME ZONE '<correct_time_zone>';
6 голосов
/ 27 июня 2011

Существуют приведения и, что более важно, оператор 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)
...