#oracle #sql
Запрос: SELECT to_date(DH.LAST_STATE_CHANGED, 'dd.mm.yy') FROM os_doc.document_header dh Ошибка: ORA-01861: литерал не соответствует формату строки
Ответы
Ответ 1
Разный NLS_DATE_FORMAT в каждом из инструментов.Ответ 2
Колонка last_state_changed в SQL выражении используется неверно. Возможно в каком то инструменте и будет работать, но не надо полагаться на случай. Правильно так: select to_char (dh.last_state_changed, 'dd.mm.yy') from os_doc.document_header dh Почему так? Колонка document_header.last_state_changed имеет тип данных DATE (объявление как VARCHAR2 я не расматриваю, т.к. это было бы наиболее вероятно ошибкой при разработке схемы БД): Данные сначала неявно конвертируются в VARCHAR2. т.к. перегруженая функция to_date (dt date, format varchar2) отсутствует как бессмысленная. Далее, данные явно конвертируются в тип данных DATE используя маску формата 'dd.mm.yy'. В заключении, так как внутреннее представление типа данных DATE не совсем "читабельно", оно неявно конвертируется снова в символьное представление. Во всех случаях неявного конвертирования используется значение NLS_DATE_FORMAT, которое может быть задано в реестре Windows, переменной окружения или в установках используемого инструмента. При несовпадении этого значения с маской формата заданной явно, возникают различные ошибки конвертирования, зависящие от места, в котором символьный литерал не совпадает с маской формата: ORA-01861: literal does not match format string ORA-01843: not a valid month ORA-01858: a non-numeric character was found where a numeric was expected ORA-01840: input value not long enough for date format
Комментариев нет:
Отправить комментарий