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

cx_Oracle 'ORA-01843:neplatný měsíc' s parametrem unicode

Ve skutečnosti je to chyba v Oracle 10.5.0.2 a 11.2.0.1.

Chybu lze reprodukovat následovně:

nastavte NLS_TIMESTAMP_FORMAT v relaci.

Spusťte jakoukoli implicitní nebo explicitní konverzi TO_DATE s daty unicode.

Další implicitní nebo explicitní TO_TIMESTAMP s údaji Unicode spustí interní reset formátu časového razítka.

Všechny po sobě jdoucí TO_TIMESTAMP selžou a TO_CHAR časového razítka vytvoří neplatný výstup.

Zde je kód pro testování chování:

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. Funkce vyhledávání s řeckými znaky v MySQL

  2. Jak funguje funkce RIGHT() v SQL Server (T-SQL)

  3. Vyhledejte telefonní číslo z databáze MYSQL

  4. SQL INTERSECT