As Regras de conversão de string para data permitir regras de formatação adicionais (sem que outros modificadores sejam aplicados). Então:
MM
também corresponde aMON
eMONTH
;MON
corresponde aMONTH
(e vice-versa);RR
corresponde aRRRR
; e- A pontuação é opcional.
Então:
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;
Todos geram a data
2016-08-10T00:00:00
. Você pode evitar isso usando o
FX
modelo de formato
Então:
SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR' ) FROM DUAL;
Dá:
ORA-01858: a non-numeric character was found where a numeric was expected
e só corresponderia onde uma correspondência de padrão exata for encontrada (embora RR
ainda corresponderá a RRRR
). Sim, a Oracle está usando implicitamente
TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT )
para fazer a conversão. Se você usar:
ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';
Então sua inserção falhará.