sql >> Databasteknik >  >> RDS >> Oracle

Påträffar SQL-fel:ORA-01843:inte en giltig månad

'04/04/2012 13:35 PM' är inte ett datum - det är en sträng.

Oracle kommer att göra en implicit TO_DATE( string_value, format_mask ) på bokstaver som inte är datum när du infogar dem i en DATE kolumnen med värdet för NLS_DATE_FORMAT sessionsparameter som formatmasken (observera:detta är en sessionsparameter och tillhör klienten; det är inte en global inställning ). Om den icke-datumliteralen matchar detta format kommer den att fungera (och om den inte gör det kommer den inte att fungera) - dock om NLS_DATE_FORMAT någonsin ändras så kommer den omedelbart att gå sönder (det är svårt att felsöka eftersom koden som fungerade inte kommer att fungera men ingen kommer att ha ändrat koden).

Du kan ta reda på din nuvarande NLS_DATE_FORMAT med frågan:

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

Det är bättre att uttryckligen använda TO_DATE() med rätt formatmask eller att använda en ANSI/ISO-datumliteral (dvs. DATE '2012-04-04' eller TIMESTAMP '2012-04-04 13:35' ).

Du kan göra:

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

(du behöver inte AM/PM eftersom timkomponenten redan är på en 24-timmarsklocka)

eller

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

(med hjälp av ANSI/ISO-tidsstämpeln som Oracle implicit konverterar till ett datum)



  1. Inledningssituation med oracle (sub query stuffs)

  2. Hur man byter ut specialtecken och sedan bryter linjen i oracle

  3. Filtrera data att visa från databasen i javafx

  4. skapa en pseudo länkad lista i sql