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

cx_Oracle „ORA-01843:невалиден месец“ с параметър unicode

Това всъщност е грешка в Oracle 10.5.0.2 и 11.2.0.1.

Грешката може да бъде възпроизведена по следния начин:

задайте NLS_TIMESTAMP_FORMAT в сесия.

Изпълнете всяко имплицитно или явно преобразуване на TO_DATE с данни в unicode.

Следващият неявен или явен TO_TIMESTAMP с данни в уникод ще задейства вътрешно нулиране на формата на клеймото за време.

Всички последователни TO_TIMESTAMP ще бъдат неуспешни и TO_CHAR от времевия знак ще произведат невалиден резултат.

Ето кода за тестване на поведението:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';

REM --- WORKS:
SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;

REM --- WORKS:
SELECT TO_DATE('2013-06-24 18:15:10') FROM DUAL;

REM --- WORKS:
SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;

REM --- WORKS:
SELECT TO_TIMESTAMP(x) FROM (SELECT CAST('2013-06-24 18:15:10.312' AS NVARCHAR2(30)) AS X FROM DUAL);

REM --- WORKS:
SELECT TO_DATE(x) FROM (SELECT CAST('2013-06-24 18:15:10' AS NVARCHAR2(30)) AS X FROM DUAL);

REM --- WORKS:
SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;

REM !!! FAILS!
SELECT TO_TIMESTAMP(x) FROM (SELECT CAST('2013-06-24 18:15:10.312' AS NVARCHAR2(30)) AS X FROM DUAL);

REM !!! FAILS!
SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;

REM --- WORKS:
SELECT TO_DATE('2013-06-24 18:15:10') FROM DUAL;


  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 Transparent Data Encryption недекриптиран достъп

  2. Свързване към отдалечена Oracle DB с Nodejs чрез Oracledb драйвер

  3. Каква е разликата между (*) и .* в regexp?

  4. REGEXP Подниз Oracle

  5. как да деактивирате едновременни връзки от един потребител на oracle