Ora-01821 формат даты не распознан - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу изменить строку в поле даты, но я получил ошибку ora-01821, формат даты не распознан при выполнении следующего запроса. Также мне нужен am / pm в БД. Как добиться этого

update bucket set closed = to_date(closed_on,'dd-mon-yy hh.mi.ss.ff a.m')

Значение Closed_on будет таким же, как 29 мая 19.09.16.00.000000 PM

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

Я думаю, что вы хотите использовать TO_TIMESTAMP - дата не может хранить ваши миллисекунды, поэтому она не понимает FF

select  to_timestamp('29-MAY-19 09.01.16.00000000 PM','dd-mon-yy hh.mi.ss.FF8 AM') from dual

Примечание, как указал GMB, вы не можете получить oracle для разбора a.m - вам придется сделать это либо a.m., либо am. Никаких полумер :) (надеюсь, это ошибка при копировании пасты)

Если вы отчаянно нуждаетесь в использовании TO_DATE, отрежьте миллисекунды:

select 
  to_date(
    SUBSTR('29-MAY-19 09.01.16.00000000 PM', 1, 18) || SUBSTR('29-MAY-19 09.01.16.00000000 PM', -2, 2),
    'dd-mon-yy hh.mi.ssAM'
  ) 
from dual

Если ваше время стр заставьте второй SUBSTR использовать , -4, 4) - «начать справа, 4 места слева, затем взять 4 символа»

Если миллис всегда равен 00000000, вы можете сделать это с помощью REPLACE(timeStr, '.00000000 ', '') вместо

0 голосов
/ 06 апреля 2020

Другой вариант - пропустить символы с помощью # следующим образом:

SQL> SELECT
  2      TO_DATE('29-MAY-19 09.01.16.00000000 PM', 'DD-MON-YYYY HH.MI.SS.######## AM')
  3  FROM
  4      DUAL;

TO_DATE('29-MAY-1909.01
-----------------------
29-MAY-0019 09.01.16 PM

SQL>

Число # должно быть количеством пропускаемых символов.

0 голосов
/ 06 апреля 2020

Дробных секунд (FF) нет с типом данных DATE. Поэтому, если столбец вашей таблицы closed_on имеет тип Date, он не будет работать. Caius Jard предложил хорошие альтернативные решения.

...