sql >> Database >  >> RDS >> Oracle

Er is een SQL-fout opgetreden:ORA-01843:geen geldige maand

'04/04/2012 13:35 PM' is geen datum - het is een string.

Oracle doet een impliciete TO_DATE( string_value, format_mask ) op niet-date letterlijke waarden bij het invoegen in een DATE kolom met de waarde van de NLS_DATE_FORMAT sessieparameter als formaatmasker (opmerking:dit is een sessieparameter en hoort bij de client; het is geen globale instelling ). Als de letterlijke niet-datum overeenkomt met dit formaat, zal het werken (en als dat niet het geval is, dan niet) - echter, als de NLS_DATE_FORMAT ooit wordt gewijzigd, zal het onmiddellijk breken (het zal een enorme pijn zijn om te debuggen omdat de code die werkte niet, maar niemand zal de code hebben gewijzigd).

U kunt uw huidige NLS_DATE_FORMAT . achterhalen met de vraag:

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

Het is beter om expliciet TO_DATE() te gebruiken met het juiste formaatmasker of om een ​​letterlijke ANSI/ISO-datum te gebruiken (d.w.z. DATE '2012-04-04' of TIMESTAMP '2012-04-04 13:35' ).

Je kunt het volgende doen:

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

(je hebt de AM/PM niet nodig aangezien de uurcomponent al op een 24-uursklok staat)

of

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

(met behulp van de letterlijke ANSI/ISO-tijdstempel die Oracle impliciet naar een datum zal converteren)



  1. Postgresql truncate-tabel met externe sleutelbeperking

  2. Hoe Oracle EBS Auditing in te stellen

  3. NodeJS, sluit mysql-verbinding niet

  4. Hoe voeg ik een reeks waarden in verschillende kolommen van een mysql-tabel in?