Les règles de conversion de chaîne en date autoriser des règles de formatage supplémentaires (sans qu'aucun autre modificateur ne soit appliqué). Donc :
MM
correspond également àMON
etMONTH
;MON
correspond àMONTH
(et vice versa);RR
correspond àRRRR
; et- La ponctuation est facultative.
Donc :
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;
Tous génèrent la date 2016-08-10T00:00:00
.
Vous pouvez empêcher cela en utilisant le FX
modèle de format
Ensuite :
SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR' ) FROM DUAL;
Donne :ORA-01858: a non-numeric character was found where a numeric was expected
et ne correspondrait qu'à l'endroit où une correspondance de modèle exacte est trouvée (bien que RR
correspondra toujours à RRRR
).
Oui, oracle utilise implicitement TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT )
pour faire la conversion.
Si vous utilisez :
ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';
Ensuite, votre insertion échouera.