ORA-1882 при попытке перейти на летнее время

#sql #oracle #oracle11g #timestamp-with-timezone

#sql #Oracle #oracle11g #временная метка с часовым поясом

Вопрос:

Мы получаем файл от внешнего поставщика. Один из столбцов содержит временную метку в форме «05/01/2014 09:25:41 AM EDT». Я пытаюсь вставить это в ВРЕМЕННУЮ МЕТКУ СО столбцом ЧАСОВОГО ПОЯСА со следующим SQL:

INSERT INTO table VALUES (to_timestamp_tz('05/01/2014 09:25:41 AM EDT', 'MM/DD/YYYY HH12:MI:SS AM TZR TZD'));

Вот когда я получаю ORA-1882: timezone region not found . Я также попытался указать это следующим образом

INSERT INTO table VALUES (to_timestamp_tz('05/01/2014 09:25:41 AM EST EDT', 'MM/DD/YYYY HH12:MI:SS AM TZR TZD'));

но потом я понимаю ORA-1857: not a valid time zone .

У кого-нибудь есть идея, как я могу это вставить? Мы используем Oracle 11.2.0.3. Я вижу, v$timezone_names что EST и EDT оба кажутся допустимыми tzabbrev для tzname ‘Америка / Нью-Йорк’.

Редактировать:

Похоже, что если я заменю EST5EDT на EDT (и CST6CDT, MST7MDT и PST8PDT на CST, MST и PST соответственно), я смогу получить нужное мне поведение. Проблема с этим заключается в том, что мне нужно заранее знать, что это за замены, чтобы я мог их обойти. Мне все еще нужно знать, как справиться с потенциальными проблемами перехода на летнее время в других часовых поясах.

Ответ №1:

INSERT INTO TAB VALUES (to_timestamp_tz('05/01/2014 08:25:41 AM ,America/New_York',
'MM/DD/YYYY HH12:MI:SS.FF AM TZR:TZD'));

Комментарии:

1. Для этого требуется, чтобы я знал регион, связанный с часовым поясом. Все, что я получаю в файле, — это EST, EDT, PST и т.д.

Ответ №2:

Короткие имена невозможны, поскольку они неоднозначны. ECT например, может использоваться для «Европейского центрального времени», «Эквадорского времени» или «Восточно-Карибского времени». Таким образом, вы должны использовать длинные имена, например America/New_York , или обозначение UTC /-hh: mi.

Комментарии:

1. Может быть, я тогда этого не понимаю. Потому что, когда я делаю что-то вроде этого: to_timestamp_tz('05/01/2014 09:25:41 AM EST', 'MM/DD/YYYY HH12:MI:SS AM TZR') , я правильно получаю UTC -5:00, поэтому он четко знает, что я имею в виду Восточный стандарт. Я полагал, что добавление EDT после этого сообщит базе данных, что это также зона перехода на летнее время. Думаю, мне придется придумать что-нибудь еще.