Ngày không có định dạng - ngày được lưu trữ bên trong cơ sở dữ liệu dưới dạng 7 byte (đại diện cho năm, tháng, ngày, giờ, phút và giây) và phải đến khi bất kỳ giao diện người dùng nào bạn đang sử dụng (tức là SQL / Plus, SQL Developer, Java, v.v.) cố gắng hiển thị nó cho bạn, người dùng và chuyển đổi nó thành một cái gì đó mà bạn sẽ thấy có ý nghĩa (thường là một chuỗi) mà ngày có định dạng.
Nếu bạn đang cung cấp một ngày được định dạng cho một thủ tục thì nó sẽ là một chuỗi và Oracle sẽ cố gắng truyền ngầm nó thành một ngày bằng cách sử dụng NLS_DATE_FORMAT
tham số phiên:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
Được chuyển đổi ngầm thành
UPDATE your_table
SET your_date_column = TO_DATE(
'18-06-14',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
);
Nếu NLS_DATE_FORMAT
không khớp thì Oracle sẽ đưa ra một ngoại lệ (và tham số có thể được đặt bởi mỗi người dùng, do đó bạn không nên tin rằng nó nhất quán - đặc biệt là trong các tổ chức quốc tế khi định dạng ngày mặc định phụ thuộc vào lãnh thổ và ngôn ngữ của bạn).
Nếu bạn đang cập nhật giá trị thì hãy sử dụng DATE
chữ chứ không phải chuỗi:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';
Hoặc chuyển đổi rõ ràng chuỗi và cung cấp mô hình định dạng:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
Điều này cũng đúng với việc chuyển các tham số cho hàm của bạn. Sử dụng DATE
chữ:
BEGIN
your_procedure(
p_launch_date => DATE '2014-06-18'
);
END;
/
hoặc chuyển đổi rõ ràng chuỗi thành một ngày (và không dựa vào chuyển đổi ngầm định):
BEGIN
your_procedure(
p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
);
END;
/