Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Kann nicht nachvollziehen, wie der Wert implizit in das Datumsformat konvertiert wurde

Die String-to-Date-Konvertierungsregeln zusätzliche Formatierungsregeln zulassen (ohne dass andere Modifikatoren angewendet werden). Also:

  • MM passt auch zu MON und MONTH;
  • MON stimmt mit MONTH überein (und umgekehrt);
  • RR stimmt mit RRRR überein; und
  • Die Satzzeichen sind optional.

Also:

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;

Alle generieren das Datum 2016-08-10T00:00:00 .

Sie können dies verhindern, indem Sie den FX Formatmodell

Dann:

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

Ergibt:ORA-01858: a non-numeric character was found where a numeric was expected und würde nur dort übereinstimmen, wo eine exakte Musterübereinstimmung gefunden wird (obwohl RR stimmt immer noch mit RRRR überein ).

Ja, Oracle verwendet implizit TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT ) um die Konvertierung durchzuführen.

Wenn Sie verwenden:

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

Dann schlägt Ihre Einfügung fehl.