#postgresql #datetime #timezone #timestamp-with-timezone
#postgresql #datetime #Часовой пояс #timestamp-with-timezone
Вопрос:
У меня есть таблица с несколькими столбцами временных меток, в основном следующими:
timestamp_utc | timestamp
------------------------------------------------------------
'2020-10-28 08:00:00.000' | '2020-10-28 04:00:00.000'
Я знаю, что первый столбец находится во времени UTC, а второй — по Нью-йоркскому времени. Мне было интересно, как я могу добавить соответствующий часовой пояс. Итак, результат, который я хотел бы получить, выглядит примерно так:
timestamp_utc | timestamp
------------------------------------------------------------
'2020-10-28 08:00:00.000Z' | '2020-10-28 04:00:00.000-04'
Я пытался делать такие вещи, как:
>>> select timestamp_utc AT TIME ZONE 'UTC' from table;
'2020-10-28 04:00:00.000-04' /* wrong */
>>> select timestamp AT TIME ZONE 'EST' from table;
'2020-10-28 05:00:00.000-04' /* wrong, it should be 04:00:00 */
Итак, наконец-то попробовал это для Нью-йоркской части:
>>> select timestamp_est AT TIME ZONE 'America/New_York' from table;
'2020-10-28 04:00:00.000-04'
Поэтому я думаю, что когда я добавляю часовой пояс с указанием местоположения, это работает. Однако, когда я пытаюсь использовать истинные часовые пояса, это преобразует время в дополнение к добавлению часового пояса?
Комментарии:
1. Какие типы для столбцов
timestamp_utc
иtimestamp
(К вашему сведению, я бы переименовал это или сделал с вамиtimestamp_est
)? Каковы настройкиTimeZone
для сервера?2. Имена столбцов — это просто фиктивные примеры, поэтому не беспокойтесь, если это называется timestamp . Часовой пояс установлен, но я не могу изменить часовой пояс сервера. Обойдите это, используя Python вместо PG. Как сказал @Laurenz Albe, вероятно, это невозможно сделать в PG
3. Я бы посмотрел этот раздел » Часовые пояса » в документах. Это поможет вам понять, что происходит. Подсказка для вашего
TimeZone
значения не установленаEST
. SecondEST
— это действительно просто смещение, а не полный часовой пояс, отсюда и ошибка в вашем преобразовании. Наконец, важен тип данных, в котором вы храните свои значения: timestamp или timestamptz. Я постоянно используюdateutil
Python, но это все равно зависит от базового поведения в базе данных.
Ответ №1:
Вы не можете этого сделать, поскольку PostgreSQL (вопреки интуиции) не сохраняет часовой пояс вместе с a timestamp with time zone
. Этот тип данных внутренне хранится в UTC, и на дисплее он преобразуется в соответствии с текущей настройкой timezone
параметра.
Итак, есть два способа сохранить смещение часового пояса с меткой времени:
-
Добавьте новый столбец
timezone
, содержащий часовой пояс в виде строки (Europe/Vienna
) или числа (2
). -
Сохраните временную метку в виде строки. Обычно это плохая идея.
Комментарии:
1. Я бы предостерег от сохранения смещения часового пояса (2). Поскольку при этом НЕ учитывается переход на летнее время (летнее время), где учитывается соответствующее имя часового пояса.
2. @Страховщик я согласен. Я только что предложил возможность использования числового смещения, поскольку, похоже, это то, что запрашивает OP.