Как я могу предотвратить сброс даты и времени в Redshift INSERT datetime? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть String в этом формате: 2018-11-01T00:00:00-07:00, и я хотел бы преобразовать его в TIMESTAMP и вставить в столбец TIMESTAMP.Однако, когда я вставляю его, он сбрасывает -07:00 без предварительного преобразования в -00:00.Как убедиться, что он преобразован и правильно хранится в Redshift?

Вот пример: select ORIGINAL_DATE, TO_TIMESTAMP(ORIGINAL_DATE,'YYYY-MM-DD HH24:MI:SS') FROM CDW_LANDING.X where id = XXXXXX;

=> 2018-11-01T00:00:00-07:00 2018-10-31 17:00:00

Преобразование TO_TIMESTAMPэто к 2018-10-31 17:00:00 что я и хочу.Однако, когда я вставляю его, он становится 2018-11-01 00:00:00 и просто отбрасывает -07:00.

Вот пример:

insert into cdw_stage.X (ORIG_DT) 
select TO_TIMESTAMP(ORIGINAL_DATE,'YYYY-MM-DD HH24:MI:SS') 
from CDW_LANDING.INVOICE where id = XXXXXX;

Но когда я запрашиваю его с помощью select ORIG_DT from cdw_landing.X;,он отображает 2018-11-01 00:00:00.Я хотел бы видеть 2018-10-31 17:00:00, что и должна делать функция TO_TIMESTAMP.

ORIG_DT в Redshift имеет формат TIMESTAMP.Дата ввода в VARCHAR.

Как мне получить Redshift, чтобы сохранить это правильно?Я также добавил тег postgres, потому что Redshift основан на postgres.Большое вам спасибо !!!

1 Ответ

0 голосов
/ 05 марта 2019

2018-11-01T00:00:00-07:00 является не a timestamp (timestamp without time zone) буквально, строго говоря.Это timestamptz (timestamp with time zone) литерал.Это корень всей боли в вашем вопросе.Неправильное приведение к timestamp игнорирует смещение. Руководство Postgres:

В литерале, который был определен как timestamp without time zone, PostgreSQL будет молча игнорировать любую индикацию часового пояса.Таким образом, результирующее значение получено из полей даты / времени во входном значении и не скорректировано для часового пояса .

Шахта выделения жирным шрифтом.

Использование TO_TIMESTAMP() не может вас спасти. Руководство Redshift:

Форматы, содержащие часовой пояс (TZ, tz или OF), не поддерживаются в качестве входных данных.

(То же самое верно и в Postgres.)

Решение

Приведение к timestamptz (или использование столбца этого типа для начала), остальные должны встать на место:

SELECT cast('2018-11-01T00:00:00-07:00' AS timestamptz);

Или:

SELECT '2018-11-01T00:00:00-07:00'::timestamptz;

Руководство по кастингу в Redshift.

Когда фактическому timestamptz назначаетсяСтолбец timestamp преобразуется автоматически в соответствии с текущей настройкой timezone сеанса.Если вы хотите другой целевой часовой пояс, используйте конструкцию AT TIME ZONE.Подробности:

Соответствующий ответ для Postgres, но обработка меток времени в Redshift (хотя отличаетсямного других аспектов!) то же самое. Руководство Redshift:

При преобразовании DATE или TIMESTAMP в TIMESTAMPTZ предполагается, что DATE или TIMESTAMP используют часовой пояс текущего сеанса.Часовой пояс сеанса по умолчанию является UTC.Для получения дополнительной информации о настройке часового пояса сеанса см. часовой пояс .

...