Правила за преобразуване от низ към дата позволява допълнителни правила за форматиране (без да се прилагат други модификатори). И така:
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';
Тогава вашето вмъкване ще се провали.