String-to-Date-konverteringsreglerna tillåt ytterligare formateringsregler (utan att några andra modifierare tillämpas). Så:
MM
matchar ävenMON
ochMONTH
;MON
matcharMONTH
(och vice versa);RR
matcharRRRR
; och- Teckensättning är valfri.
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;
Alla genererar datumet 2016-08-10T00:00:00
.
Du kan förhindra detta genom att använda FX
formatmodell
Sedan:
SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR' ) FROM DUAL;
Ger:ORA-01858: a non-numeric character was found where a numeric was expected
och skulle bara matcha där en exakt mönstermatchning hittas (även om RR
kommer fortfarande att matcha RRRR
).
Ja, Oracle använder implicit TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT )
för att göra konverteringen.
Om du använder:
ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';
Då misslyckas din infogning.