sql >> Base de Datos >  >> RDS >> Oracle

No se puede entender cómo el valor se convierte al formato de fecha implícitamente

Las Reglas de conversión de cadena a fecha permitir reglas de formato adicionales (sin que se aplique ningún otro modificador). Entonces:

  • MM también coincide con MON y MONTH;
  • MON coincide con MONTH (y viceversa);
  • RR coincide con RRRR; y
  • La puntuación es opcional.

Entonces:

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 generan la fecha 2016-08-10T00:00:00 .

Puede evitar esto usando FX modelo de formato

Entonces:

SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR'    ) FROM DUAL;

Da:ORA-01858: a non-numeric character was found where a numeric was expected y solo coincidiría donde se encuentra una coincidencia de patrón exacta (aunque RR aún coincidirá con RRRR ).

Sí, Oracle está usando implícitamente TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT ) para hacer la conversión.

Si usa:

ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';

Entonces su inserción fallará.