Ngày không có định dạng - chúng được trình bày nội bộ bằng 7- hoặc 8 byte . Chỉ khi một chương trình khách được chuyển qua một ngày thì chương trình khách đó (có khả năng) mới cung cấp cho nó một định dạng.
Định dạng chuỗi mặc định cho ngày tháng trong SQL / Plus hoặc SQL Developer được đặt bởi NLS_DATE_FORMAT
tham số phiên. Các ứng dụng khách khác thường sẽ có các tham số mà bạn có thể đặt cho định dạng ngày mặc định (nếu họ cũng không sử dụng NLS
cài đặt). Tuy nhiên, hãy cẩn thận rằng NLS_DATE_FORMAT
là một tham số phiên, do đó, nó thuộc về phiên của người dùng và nhiều người dùng, mỗi người có thể có một giá trị khác nhau cho thông số tương ứng với cách họ đã đặt nó.
Nếu bạn muốn đặt một ngày ở một định dạng cụ thể thì bạn sẽ cần phải chuyển đổi nó thành một chuỗi:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
Tại sao truy vấn của bạn không hoạt động :
TO_DATE( value, frmt )
mong đợi một giá trị chuỗi và một mặt nạ định dạng. TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
hoàn toàn hợp lệ và sẽ trả về DATE '2016-05-01'
.
Tuy nhiên, TO_DATE()
bên ngoài sau đó được chuyển qua DATE
nhập bạn vừa tạo và định dạng chuỗi (thay vì hai chuỗi mà nó đang mong đợi). Oracle sẽ ngầm gọi TO_CHAR()
vào ngày và sử dụng NLS_DATE_FORMAT
tham số phiên làm mặt nạ định dạng. Điều này đang tạo ra một chuỗi từ ngày và do lỗi, giá trị của NLS_DATE_FORMAT
không phải là MM/DD/YYYY HH24:MI:SS
vì vậy khi TO_DATE()
bên ngoài cố gắng phân tích cú pháp chuỗi được tạo ngầm định, nó không thành công vì số đầu tiên nó đọc không hợp lệ trong một tháng.