Правила за преобразуване от низ към дата позволява допълнителни правила за форматиране (без да се прилагат други модификатори). И така:
MMсъщо съответства наMONиMONTH;MONсъответства наMONTH(и обратно);RRсъвпада сRRRR; и- Пунктуацията не е задължителна.
И така:
SELECT TO_DATE( '10AUGUST2016', 'DD-MM-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUGUST2016', 'DD-MON-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUGUST2016', 'DD-MONTH-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUG2016', 'DD-MM-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUG2016', 'DD-MON-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUG2016', 'DD-MONTH-RR' ) FROM DUAL;
Всички генерират датата 2016-08-10T00:00:00 .
Можете да предотвратите това, като използвате FX модел на формат
След това:
SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR' ) FROM DUAL;
Дава:ORA-01858: a non-numeric character was found where a numeric was expected и ще съвпадне само там, където е намерено точно съвпадение на шаблон (въпреки че RR пак ще съответства на RRRR ).
Да, Oracle имплицитно използва TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT ) за да извършите преобразуването.
Ако използвате:
ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';
Тогава вашето вмъкване ще се провали.