sql >> Databáze >  >> RDS >> Oracle

Setkání s chybou SQL:ORA-01843:neplatný měsíc

'04/04/2012 13:35 PM' není datum – je to řetězec.

Oracle provede implicitní TO_DATE( string_value, format_mask ) na nedatové literály při jejich vkládání do DATE pomocí hodnoty NLS_DATE_FORMAT parametr relace jako masku formátu (poznámka:toto je parametr relace a patří klientovi; nejedná se o globální nastavení ). Pokud se nedatový literál shoduje s tímto formátem, bude fungovat (a pokud ne, pak nebude) – pokud však NLS_DATE_FORMAT pokud se někdy změní, okamžitě se rozbije (cokoli je velmi obtížné ladit, protože kód, který fungoval, se to nezmění, ale nikdo kód nezmění).

Můžete zjistit svůj aktuální NLS_DATE_FORMAT s dotazem:

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

Je lepší explicitně použít TO_DATE() se správnou maskou formátu nebo použít datový literál ANSI/ISO (tj. DATE '2012-04-04' nebo TIMESTAMP '2012-04-04 13:35' ).

Můžete:

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

(nepotřebujete AM/PM protože hodinová složka je již na 24hodinovém formátu)

nebo

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

(pomocí literálu časového razítka ANSI/ISO, který Oracle implicitně převede na datum)



  1. MySQL:ERROR 1022 (23000):Nelze zapisovat; duplicitní klíč v tabulce '#sql-2b8_2'

  2. MySQL - Pulling List v závislosti na datu a kategorii

  3. Vliv různých technik zpracování chyb na výkon

  4. Seskupte postupně hodnoty v MySQL a přidejte k takovým skupinám ID