Мне нужно импортировать в него данные без информации о часовом поясе (однако я знаю конкретный часовой пояс данных, которые я хочу импортировать), но мне нужен формат timestamp with time zone
в базе данных. Как только я импортирую его и установлю тип данных временной метки на timestamp with time zone
, Postgres автоматически предположит, что данные в таблице относятся к моему часовому поясу, и назначит ему мой часовой пояс. К сожалению, данные, которые я хочу импортировать, не относятся к моему периоду времени, поэтому это не работает.
База данных также содержит данные с разными часовыми поясами. Однако часовой пояс в одной таблице всегда один и тот же.
Теперь я могу установить часовой пояс базы данных в часовой пояс данных, которые я хочу импортировать, перед импортом данных (используя команду SET time zone
) и изменить его обратно на мой часовой пояс после завершения импорта, и я почти уверен уже сохраненные данные не будут затронуты изменением часового пояса базы данных. Но это кажется довольно грязным подходом и может вызвать проблемы позже.
Интересно, есть ли более элегантный способ указать часовой пояс для импорта, не имея данных о часовом поясе в самих данных?
Кроме того, я не нашел способа редактировать информацию о часовом поясе после импорта. Есть ли способ не конвертировать, а просто редактировать часовой пояс для всей таблицы, предполагая, что вся таблица имеет одинаковое смещение часового пояса (т.е. если при вводе/импорте данных был назначен неправильный)?
Изменить:
Мне удалось указать часовой пояс при импорте, вся команда:
set session time zone 'UTC';
COPY tbl FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;
set session time zone 'CET';
Затем данные импортируются с использованием часового пояса сеанса. Я предполагаю, что это не влияет на какие-либо другие запросы к базе данных одновременно с другими подключениями?
Изменить 2:
Впоследствии я узнал, как изменить часовой пояс таблицы:
Смещение часового пояса обновления PostgreSQL
Я полагаю, что более элегантно изменить часовой пояс таблицы после импорта, чем использовать сеанс для временного изменения локального часового пояса. Предполагая, что вся таблица имеет один и тот же часовой пояс, конечно.
Таким образом, теперь код будет выглядеть примерно так:
COPY tbl FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;
UPDATE tbl SET <tstz_field> = <tstz_field> AT TIME ZONE '<correct_time_zone>';