Bạn đang thực hiện nhiều chuyển đổi ngày ngầm trong cả hai phiên bản. Cái này:
SELECT to_date(to_char(to_date('01-FEB-1949'))) FROM DUAL;
tương đương với:
SELECT to_date(to_char(to_date('01-FEB-1949', <NLS_DATE_FORMAT>),
<NLS_DATE_FORMAT>, <NLS_DATE_FORMAT>)) FROM DUAL;
trong khi truy vấn thứ hai có một trong những truy vấn được thay thế bằng một định dạng cụ thể. Nó trông giống như định dạng mặc định của bạn - mà bạn có thể đặt, tôi tin rằng, trong tùy chọn Toad mà không cần sửa đổi sổ đăng ký trực tiếp; không rõ bạn thậm chí đang sửa đổi thứ gì đó liên quan đến Toad - là DD-MON-RR
, như được hiển thị bằng cách cắm nó vào các truy vấn sau:
SELECT to_date(to_char(to_date('01-FEB-1949','DD-MON-RR'),
'DD-MON-RR'),'DD-MON-RR') AS date1,
to_date(to_char(to_date('01-FEB-1949','DD-MON-RR'),
'dd-MON-yyyy'),'DD-MON-RR') AS date2 FROM DUAL;
DATE1 DATE2
February, 01 2049 00:00:00+0000 February, 01 1949 00:00:00+0000
( SQL Fiddle )
Bạn có thể xem trong SQL Fiddle này
rằng trong phiên bản đầu tiên, ngày xuất hiện dưới dạng chuỗi với năm là 49
chứ không phải là 1949
và điều đó sau đó được diễn giải - bởi RR
mask - as 2049
, đó là hành vi được mong đợi.
Phiên bản ngắn:không bao giờ dựa vào các chuyển đổi ngày tháng ngầm định hoặc mặt nạ định dạng ngày NLS.