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

Opstår SQL-fejl:ORA-01843:ikke en gyldig måned

'04/04/2012 13:35 PM' er ikke en dato - det er en streng.

Oracle vil lave en implicit TO_DATE( string_value, format_mask ) på ikke-dato-literaler, når du indsætter dem i en DATE kolonne ved hjælp af værdien af ​​NLS_DATE_FORMAT sessionsparameter som formatmasken (bemærk:dette er en sessionsparameter og tilhører klienten; det er ikke en global indstilling ). Hvis den ikke-dato-literal matcher dette format, vil den fungere (og hvis den ikke gør det, vil den ikke) - dog hvis NLS_DATE_FORMAT nogensinde ændres, vil den øjeblikkeligt gå i stykker (det vil være en stor smerte at fejlfinde, da koden, der virkede, ikke vil, men ingen vil have ændret koden).

Du kan finde ud af din nuværende NLS_DATE_FORMAT med forespørgslen:

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

Det er bedre eksplicit at bruge TO_DATE() med det korrekte formatmaske eller at bruge en ANSI/ISO-dato-literal (dvs. DATE '2012-04-04' eller TIMESTAMP '2012-04-04 13:35' ).

Du kan gøre:

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

(du behøver ikke AM/PM da timekomponenten allerede er på et 24 timers ur)

eller

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

(ved hjælp af ANSI/ISO tidsstemplet literal, som Oracle implicit vil konvertere til en dato)



  1. SQLite virker, men PostgreSQL migreret database forårsager FEJL - Django 3.0

  2. Sekvens efter dato, tilføj dato før og dato efter postgresql med underforespørgsel

  3. MySQL FULLTEXT Søg på tværs af>1 tabel

  4. C# Mysql UTF8-kodning