'04/04/2012 13:35 PM'
không phải là ngày - nó là một chuỗi.
Oracle sẽ thực hiện một TO_DATE( string_value, format_mask )
trên các ký tự không phải ngày tháng khi chèn chúng vào DATE
sử dụng giá trị của NLS_DATE_FORMAT
tham số phiên làm mặt nạ định dạng ( lưu ý:đây là tham số phiên và thuộc về máy khách; nó không phải là cài đặt chung ). Nếu ký tự không phải ngày tháng khớp với định dạng này thì nó sẽ hoạt động (và nếu không thì nó sẽ không hoạt động) - tuy nhiên, nếu NLS_DATE_FORMAT
đã từng được thay đổi thì nó sẽ ngay lập tức bị hỏng (bất kỳ là một điều khó khăn khi gỡ lỗi vì mã đang hoạt động sẽ không hoạt động nhưng sẽ không có ai thay đổi mã).
Bạn có thể tìm hiểu NLS_DATE_FORMAT
hiện tại của mình với truy vấn:
SELECT VALUE
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Tốt hơn là sử dụng TO_DATE()
một cách rõ ràng với mặt nạ định dạng chính xác hoặc sử dụng ký tự ngày ANSI / ISO (tức là DATE '2012-04-04'
hoặc TIMESTAMP '2012-04-04 13:35'
).
Bạn có thể làm:
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );
(bạn không cần AM/PM
vì thành phần giờ đã có trên đồng hồ 24 giờ)
hoặc
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );
(sử dụng ký tự dấu thời gian ANSI / ISO mà Oracle sẽ ngầm chuyển đổi thành ngày tháng)