Trừ khi bạn có trình kích hoạt trên bảng đang đặt ngày hoặc cột dấu thời gian, sẽ cung cấp một số dấu hiệu trong ngăn xếp lỗi đầy đủ, nó giống như NLS_DATE_LANGUAGE
của bạn không mong đợi từ viết tắt của tháng bằng tiếng Anh.
Những gì bạn có là hợp lệ bằng tiếng Anh:
alter session set nls_timestamp_format = 'RR/MM/DD HH24:MI:SSXFF';
alter session set nls_date_language ='ENGLISH';
select to_timestamp('15-APR-14 01.36.58.803000000 PM',
'DD-MON-RR HH.MI.SS.FF AM') as my_date
from dual;
MY_DATE
---------------------------
14/04/15 13:36:58.803000000
Nhưng nếu ngôn ngữ ngày mặc định trong phiên của bạn là tiếng Ba Lan (phỏng đoán từ hồ sơ của bạn), nó sẽ gây ra lỗi này - với thông báo lỗi vẫn bằng tiếng Anh:
alter session set nls_date_language ='POLISH';
select to_timestamp('15-APR-14 01.36.58.803000000 PM',
'DD-MON-RR HH.MI.SS.FF AM') as my_date
from dual;
SQL Error: ORA-01843: not a valid month
01843. 00000 - "not a valid month"
Nếu bạn không muốn đặt phiên của mình thành tiếng Anh, bạn có thể ghi đè phiên của mình cho một câu lệnh cụ thể bằng cách cung cấp tham số thứ ba tùy chọn cho to_timestamp()
:
alter session set nls_date_language ='POLISH';
select to_timestamp('15-APR-14 01.36.58.803000000 PM',
'DD-MON-RR HH.MI.SS.FF AM',
'NLS_DATE_LANGUAGE=ENGLISH') as my_date
from dual;
MY_DATE
---------------------------
14/04/15 13:36:58.803000000
Bạn cũng có thể tránh hoàn toàn vấn đề này bằng cách sử dụng số tháng thay vì tên tháng hoặc sử dụng cú pháp theo nghĩa đen của dấu thời gian ANSI:
select timestamp '2014-04-15 13:36:58.803' from dual;
TIMESTAMP'2014-04-1513:36:58.803'
---------------------------------
14/04/15 13:36:58.803000000
Tất cả các phương pháp này cũng hoạt động cho các cột ngày tháng; to_date()
chức năng bị ảnh hưởng bởi cài đặt NLS theo cách giống nhau và có cùng tham số ngôn ngữ ngày tùy chọn.