Oracle
 sql >> база данни >  >> RDS >> Oracle

Срещане на SQL грешка:ORA-01843:не е валиден месец

'04/04/2012 13:35 PM' не е дата - това е низ.

Oracle ще направи имплицитно TO_DATE( string_value, format_mask ) върху литерали без дата, когато ги вмъквате в DATE колона, използвайки стойността на NLS_DATE_FORMAT сесиен параметър като маска на формат (забележка:това е сесиен параметър и принадлежи на клиента; не е глобална настройка ). Ако литералът без дата съвпада с този формат, тогава той ще работи (а ако не, тогава няма) - обаче, ако NLS_DATE_FORMAT ако някога се промени, той незабавно ще се повреди (отстраняването на грешки ще бъде огромна болка, тъй като кодът, който е работил, няма да го направи, но никой няма да е променил кода).

Можете да разберете текущия си NLS_DATE_FORMAT със заявката:

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

По-добре е изрично да използвате TO_DATE() с правилната маска за формат или да използвате ANSI/ISO литерал за дата (т.е. DATE '2012-04-04' или TIMESTAMP '2012-04-04 13:35' ).

Можете да направите:

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

(нямате нужда от AM/PM тъй като часовият компонент вече е на 24-часов часовник)

или

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

(използвайки литерала за клеймо за време ANSI/ISO, който Oracle ще преобразува имплицитно в дата)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle -- С КЛАУЗА => СЛИВАНЕ? (Синтактична грешка, )

  2. Oracle:Изтриване на дубликати в група от таблица с присъединяване

  3. Как да тествате (единично) PL/SQL приложение с интензивно използване на данни

  4. Oracle Connect By

  5. Динамичен PL/SQL параметър за дата със запазена стойност за време