Oracle
 sql >> Database >  >> RDS >> Oracle

Incontro di errore SQL:ORA-01843:mese non valido

'04/04/2012 13:35 PM' non è una data - è una stringa.

Oracle eseguirà un implicito TO_DATE( string_value, format_mask ) su valori letterali non di data quando li inserisci in un DATE colonna utilizzando il valore di NLS_DATE_FORMAT parametro di sessione come maschera di formato (nota:questo è un parametro di sessione e appartiene al client; non è un'impostazione globale ). Se il valore letterale non di data corrisponde a questo formato, funzionerà (e in caso contrario non funzionerà), tuttavia, se NLS_DATE_FORMAT viene mai modificato, quindi si interromperà immediatamente (qualsiasi problema per il debug poiché il codice che stava funzionando non funzionerà, ma nessuno avrà cambiato il codice).

Puoi scoprire il tuo attuale NLS_DATE_FORMAT con la domanda:

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

È meglio usare esplicitamente TO_DATE() con la maschera di formato corretta o per utilizzare una data letterale ANSI/ISO (ad esempio DATE '2012-04-04' o TIMESTAMP '2012-04-04 13:35' ).

Puoi fare:

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

(non è necessario il AM/PM poiché la componente dell'ora è già impostata su 24 ore)

o

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

(usando il valore letterale del timestamp ANSI/ISO che Oracle convertirà implicitamente in una data)