Подтвердить что ты не робот

PostgreSQL изменяет метку времени без часового пояса → с часовым поясом

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

4b9b3361

Ответ 1

Он сохраняет текущее значение в локальном режиме и устанавливает часовой пояс в локальное смещение:

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.

Ответ 2

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

ALTER TABLE a ALTER COLUMN t TYPE TIMESTAMP WITH TIME ZONE USING t AT TIME ZONE 'UTC'