String-to-Date-konverteringsreglerne tillade yderligere formateringsregler (uden at der anvendes andre modifikatorer). Så:
MM
matcher ogsåMON
ogMONTH
;MON
matcherMONTH
(og omvendt);RR
matcherRRRR
; og- Tekkesætningen er valgfri.
Så:
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;
Alle genererer datoen 2016-08-10T00:00:00
.
Du kan forhindre dette ved at bruge FX
formatmodel
Så:
SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR' ) FROM DUAL;
Giver:ORA-01858: a non-numeric character was found where a numeric was expected
og ville kun matche, hvor der findes et nøjagtigt mønstermatch (selvom RR
vil stadig matche RRRR
).
Ja, oracle bruger implicit TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT )
for at udføre konverteringen.
Hvis du bruger:
ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';
Så mislykkes din indsættelse.