Формат даты ora-01821 не распознан

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

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

Значение Closed_on будет иметь вид 29-MAY-19 09.01.16.00000000 PM.


person Chelseia    schedule 06.04.2020    source источник


Ответы (3)


Я думаю, вы хотите использовать TO_TIMESTAMP - date не может хранить ваши миллисекунды, поэтому он не понимает 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

Если ваше время str равно a.m., используйте второй SUBSTR , -4, 4) - "начать справа, 4 места слева, затем взять 4 символа"

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

person Caius Jard    schedule 06.04.2020

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

person Katerina D.    schedule 06.04.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>

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

person Popeye    schedule 06.04.2020