'01/10/2008'
- это строка, а не дата.Есть четыре to_char()
функции, которые принимают разные типы аргументов, и (предположительно из-за неявного преобразования приоритета) вы фактически заканчиваете тем, что вызываете to_char(number)
, а не (date)
версия, которую вы намеревались.
Это означает, что вы фактически делаете TO_CHAR(TO_NUMBER('01/10/2008'), 'MON-YY')
, и это неявный TO_NUMBER('01/10/2008')
, который выбрасывает ORA-01722.
Если вы начинаете с этой строки ивы пытаетесь эффективно изменить формат, а затем вам нужно сначала явно преобразовать в дату, а затем преобразовать обратно в строку:
select TO_CHAR(TO_DATE('01/10/2008', 'DD/MM/YYYY'), 'MON-YY') from dual;
TO_CHA
------
OCT-08
Поскольку названия и сокращения месяцев зависят от настроек NLS, вы можетехотите переопределить настройки сеанса, чтобы получить согласованный результат:
alter session set NLS_DATE_LANGUAGE='FRENCH';
select TO_CHAR(TO_DATE('01/07/2018', 'DD/MM/YYYY'), 'MON-YY') from dual;
TO_CHAR(
--------
JUIL.-18
select TO_CHAR(TO_DATE('01/07/2018', 'DD/MM/YYYY'), 'MON-YY',
'NLS_DATE_LANGUAGE=ENGLISH') from dual;
TO_CHA
------
JUL-18