01846. 00000 - «недопустимый день недели» - PullRequest
0 голосов
/ 27 сентября 2018
updateDate ='Mon Mar 13 22:43:29 +0000 2017'
select length, 
       replace(updateDate,'+0000','') as fecha,
       TO_TIMESTAMP_TZ(
         TO_DATE(
           replace(updateDate,'+0000 ',''),
           'DY  MON DD  HH24:MI:SS YYYY'
         ),
         '+00:00',
         '-05:00'
       ) as fechaCol
from   irregularities

Я хочу преобразовать строку в формат даты, updateDate и '+0000' являются параметрами неровностей таблицы.Где ошибка?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Из документации 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
0 голосов
/ 27 сентября 2018

Выглядит так, как вы хотите:

to_timestamp_tz(updateDate,
  'DY MON DD HH24:MI:SS TZHTZM YYYY'),
  'NLS_DATE_LANGUAGE=ENGLISH')
  at time zone '-05:00'

Преобразует всю исходную строку, включая смещение часового пояса, в метку времени с часовым поясом - указывая, что названия дня и месяца на английском языке;а затем дает вам это значение в часовом поясе -5: 00.Хотя вы, вероятно, хотите использовать регион часового пояса, а не смещение.

Демо:

-- CTE for sample data
with irregularities (updateDate) as (select 'Mon Mar 13 22:43:29 +0000 2017' from dual)
-- actual query
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;

FECHACOL                            
------------------------------------
2017-03-13 17:43:29.000000000 -05:00

db <> fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...