Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Não é possível entender como o valor foi convertido para o formato de data implicitamente


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 a MON e MONTH;
  • MON corresponde a MONTH (e vice-versa);
  • RR corresponde a RRRR; 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á.