Đó thực sự là một lỗi trong Oracle 10.5.0.2 và 11.2.0.1.
Lỗi có thể được tạo lại như sau:
đặt NLS_TIMESTAMP_FORMAT trong phiên.
Chạy bất kỳ chuyển đổi TO_DATE ngầm hoặc rõ ràng nào với dữ liệu unicode.
TO_TIMESTAMP ngầm hoặc rõ ràng tiếp theo với dữ liệu unicode sẽ kích hoạt thiết lập lại nội bộ của định dạng dấu thời gian.
Tất cả TO_TIMESTAMP liên tiếp sẽ không thành công và TO_CHAR của dấu thời gian sẽ tạo ra đầu ra không hợp lệ.
Đây là mã để kiểm tra hành vi:
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;