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

SQL-Fehler:ORA-01843:kein gültiger Monat

'04/04/2012 13:35 PM' ist kein Datum - es ist ein String.

Oracle führt ein implizites TO_DATE( string_value, format_mask ) durch auf Nicht-Datumsliterale, wenn sie in ein DATE eingefügt werden Spalte mit dem Wert von NLS_DATE_FORMAT Sitzungsparameter als Formatmaske (Hinweis:Dies ist ein Sitzungsparameter und gehört dem Client; es ist keine globale Einstellung ). Wenn das Nicht-Datumsliteral mit diesem Format übereinstimmt, funktioniert es (und wenn nicht, dann nicht) - wenn jedoch NLS_DATE_FORMAT jemals geändert wird, wird es sofort kaputt gehen (das Debuggen kann sehr mühsam sein, da der Code, der funktioniert hat, nicht funktioniert, aber niemand den Code geändert hat).

Sie können Ihr aktuelles NLS_DATE_FORMAT herausfinden mit der Abfrage:

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

Es ist besser, explizit TO_DATE() zu verwenden mit der richtigen Formatmaske oder um ein ANSI/ISO-Datumsliteral zu verwenden (d. h. DATE '2012-04-04' oder TIMESTAMP '2012-04-04 13:35' ).

Sie können Folgendes tun:

INSERT INTO STORE ( id, opening_time )
  VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );

(Sie brauchen den AM/PM nicht da die Stundenkomponente bereits auf einer 24-Stunden-Uhr steht)

oder

INSERT INTO STORE ( id, opening_time )
  VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );

(unter Verwendung des ANSI/ISO-Zeitstempelliterals, das Oracle implizit in ein Datum umwandelt)