sql >> Database >  >> RDS >> Oracle

cx_Oracle 'ORA-01843:geen geldige maand' met unicode-parameter

Het is eigenlijk een bug in Oracle 10.5.0.2 en 11.2.0.1.

Bug kan als volgt worden gereproduceerd:

zet NLS_TIMESTAMP_FORMAT in sessie.

Voer elke impliciete of expliciete TO_DATE-conversie uit met unicode-gegevens.

De volgende impliciete of expliciete TO_TIMESTAMP met unicode-gegevens leidt tot een interne reset van het tijdstempelformaat.

Alle opeenvolgende TO_TIMESTAMP zullen mislukken en TO_CHAR van tijdstempel zal ongeldige uitvoer produceren.

Hier is de code om het gedrag te testen:

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. MYSQL - Bestel op id in DESC-volgorde, groepeer op X

  2. Sphinx en bedoelde je...? suggesties idee. Zal het werken?

  3. De tabel retourneren met de mysql-functie

  4. Eenvoudige Oracle-query:letterlijk komt niet overeen met opmaaktekenreeks