PostgreSQL с меткой времени без часового пояса -> с часовым поясом - PullRequest
53 голосов
/ 19 марта 2012

Вопрос короткий: если у меня уже есть данные в метке времени столбца без часового пояса, если я установил тип в метку времени с часовым поясом, что Postgresql делает с этими данными?

Ответы [ 2 ]

52 голосов
/ 19 марта 2012

Сохраняет текущее значение в местном времени и устанавливает часовой пояс со смещением вашего местного времени:

create table a(t timestamp without time zone, t2 timestamp with time zone);
insert into a(t) values ('2012-03-01'::timestamp);
update a set t2 = t;
select * from a;
          t          |           t2           
---------------------+------------------------
 2012-03-01 00:00:00 | 2012-03-01 00:00:00-08

alter table a alter column t type timestamp with time zone;
select * from a;
           t            |           t2           
------------------------+------------------------
 2012-03-01 00:00:00-08 | 2012-03-01 00:00:00-08

В соответствии с инструкцией для Изменить таблицу :

если [предложение USING] опущено, преобразование по умолчанию аналогично присвоению, приведенному от старого типа данных к новому.

Согласно руководству для Типы даты / времени

Преобразования между отметкой времени без часового пояса и отметкой времени с часовым поясом обычно предполагают, что отметка времени без часового поясаЗначение должно быть взято или задано как часовой пояс местное время.Для конвертации можно указать другой часовой пояс, используя AT TIME ZONE.

26 голосов
/ 20 марта 2016

Лучше указывать часовой пояс явно. Скажем, если ваша временная метка должна быть в UTC (но без часового пояса), вам следует опасаться того факта, что часовой пояс клиента или сервера может здесь все испортить. Вместо этого напишите:

ALTER TABLE a ALTER COLUMN t TYPE TIMESTAMP WITH TIME ZONE USING t AT TIME ZONE 'UTC'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...