Oracle
 sql >> Base de données >  >> RDS >> Oracle

Impossible de comprendre comment la valeur est convertie implicitement au format de date

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 et MONTH;
  • 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.