#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 после этого сообщит базе данных, что это также зона перехода на летнее время. Думаю, мне придется придумать что-нибудь еще.