sql >> Database teknologi >  >> RDS >> Oracle

cx_Oracle 'ORA-01843:ikke en gyldig måned' med unicode-parameter

Det er faktisk en fejl i Oracle 10.5.0.2 og 11.2.0.1.

Bug kan gengives som følger:

sæt NLS_TIMESTAMP_FORMAT i session.

Kør enhver implicit eller eksplicit TO_DATE-konvertering med unicode-data.

Næste implicitte eller eksplicitte TO_TIMESTAMP med unicode-data vil udløse intern nulstilling af tidsstempelformat.

Alle på hinanden følgende TO_TIMESTAMP vil mislykkes, og TO_CHAR af tidsstempler vil producere ugyldigt output.

Her er koden til at teste adfærd:

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. Postgres forhindrer tidsstempling med tidszonekonvertering

  2. Tilslutning til Oracle19C Server ved hjælp af Oracle11g-klient

  3. Yii2 trin-for-trin guide til login fra tabel i MySQL

  4. Hvordan bruger man PBKDF2 i Oracle 12c?