sql >> Base de Datos >  >> RDS >> Oracle

cx_Oracle 'ORA-01843:no es un mes válido' con parámetro Unicode

En realidad, es un error en Oracle 10.5.0.2 y 11.2.0.1.

El error se puede reproducir de la siguiente manera:

establezca NLS_TIMESTAMP_FORMAT en la sesión.

Ejecute cualquier conversión TO_DATE implícita o explícita con datos Unicode.

El siguiente TO_TIMESTAMP implícito o explícito con datos Unicode activará el restablecimiento interno del formato de marca de tiempo.

Todos los TO_TIMESTAMP consecutivos fallarán y TO_CHAR de la marca de tiempo producirá una salida no válida.

Aquí está el código para probar el comportamiento:

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;