Из документации TO_TIMESTAMP_TZ
:
Синтаксис
TO_TIMESTAMP_TZ (char-exp [, fmt [ 'nlsparam' ] ])
Аргументы
char-exp
Текстовое выражение, которое вы хотите преобразовать.
fmt
Указывает шаблон формата даты и времени, который будет использоваться для преобразования текстового выражения.См. Таблицу 9-4, «Элементы формата даты и времени» для получения дополнительной информации о шаблоне формата даты и времени.
Если этот аргумент пропущен, функция использует для объекта формат по умолчанию TIMESTAMP_TZ
.
nlsparam
Указывает язык, на котором возвращаются названия и сокращения месяца и дня.Этот аргумент может иметь такую форму:
'NLS_DATE_LANGUAGE = language'
Если этот аргумент пропущен, то эта функция использует язык даты по умолчанию для вашего сеанса.
TO_DATE
возвращает данные датывведите и TO_TIMESTAMP_TZ
ожидает текстовое выражение для своего первого аргумента, поэтому Oracle будет «полезен» и выполнит неявное преобразование даты обратно в текст, используя TO_CHAR
и будет использовать формат даты вашего сеанса по умолчанию (заданный NLS_DATE_FORMAT
параметр сеанса), поэтому ваш запрос эффективен:
SELECT TO_TIMESTAMP_TZ(
TO_CHAR(
TO_DATE(
replace(updateDate,'+0000 ',''),
'DY MON DD HH24:MI:SS YYYY'
),
(SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT')
),
'+00:00',
'-05:00'
) as fechaCol
from irregularities
Именно это неявное преобразование вызывает вашу ошибку по умолчанию NLS_DATE_FORMAT
, а формат для TO_TIMESTAMP_TZ
не соответствует.
Решение
Вам не нужно использовать TO_DATE
.Просто позвоните по номеру TO_TIMESTMAP_TZ
:
SELECT TO_TIMESTAMP_TZ(
updateDate
'DY MON DD HH24:MI:SS TZHTZM YYYY',
'NLS_DATE_LANGUAGE=ENGLISH'
) as fechaCol
from irregularities
Модели формата TZH
и TZM
будут считывать часы и минуты часового пояса и устанавливать временную метку на соответствующий часовой пояс для входа.
Неясно, для чего предназначены ваши +00:00
и -05:00
аргументы для функции TO_TIMESTAMP_TZ
(поскольку второй аргумент должен быть моделью формата, а третий - параметрами NLS), но если вы пытаетесь преобразоватьиз одного часового пояса в другой, затем просто используйте AT TIME ZONE '-05:00'
.
SELECT TO_TIMESTAMP_TZ(
updateDate
'DY MON DD HH24:MI:SS TZHTZM YYYY',
'NLS_DATE_LANGUAGE=ENGLISH'
) AT TIME ZONE '-05:00' as fechaCol
from irregularities