Zasady konwersji ciąg na datę zezwól na dodatkowe reguły formatowania (bez stosowania innych modyfikatorów). A więc:
MM
pasuje również doMON
iMONTH
;MON
pasuje doMONTH
(i odwrotnie);RR
pasuje doRRRR
; i- Interpunkcja jest opcjonalna.
A więc:
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;
Wszystkie generują datę 2016-08-10T00:00:00
.
Możesz temu zapobiec, używając FX
model formatu
Następnie:
SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR' ) FROM DUAL;
Daje:ORA-01858: a non-numeric character was found where a numeric was expected
i pasowałby tylko tam, gdzie znaleziono dokładne dopasowanie wzorca (chociaż RR
nadal będzie pasować do RRRR
).
Tak, Oracle niejawnie używa TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT )
aby dokonać konwersji.
Jeśli używasz:
ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';
Wtedy wstawka się nie powiedzie.