1.
To_Date(To_Char(MaxDate, 'DD/MM/YYYY')) = REP_DATE
đang gây ra sự cố. khi bạn sử dụng to_date mà không có định dạng thời gian, oracle sẽ sử dụng định dạng NLS phiên hiện tại để chuyển đổi, trong trường hợp của bạn có thể không phải là "DD / MM / YYYY". Kiểm tra cái này ...
SQL> select sysdate from dual;
SYSDATE
---------
26-SEP-12
Which means my session's setting is DD-Mon-YY
SQL> select to_char(sysdate,'MM/DD/YYYY') from dual;
TO_CHAR(SY
----------
09/26/2012
SQL> select to_date(to_char(sysdate,'MM/DD/YYYY')) from dual;
select to_date(to_char(sysdate,'MM/DD/YYYY')) from dual
*
ERROR at line 1:
ORA-01843: not a valid month
SQL> select to_date(to_char(sysdate,'MM/DD/YYYY'),'MM/DD/YYYY') from dual;
TO_DATE(T
---------
26-SEP-12
2.
Quan trọng hơn, Tại sao bạn chuyển đổi sang char và sau đó cho đến nay, thay vì so sánh trực tiếp
MaxDate = REP_DATE
Nếu bạn muốn bỏ qua thành phần thời gian trong MaxDate trước khi so sánh, bạn nên sử dụng ..
trunc(MaxDate ) = rep_date
thay vào đó.
==Cập nhật:dựa trên câu hỏi được cập nhật.
Rep_Date = 01/04/2009 Rep_Time = 01/01/1753 13:00:00
Tôi nghĩ vấn đề phức tạp hơn. nếu rep_time chỉ là thời gian, thì bạn không thể lưu trữ nó trong cơ sở dữ liệu dưới dạng ngày tháng. Nó sẽ phải là một chuỗi hoặc khoảng thời gian tính theo thời gian hoặc số dưới dạng giây (cảm ơn Alex, hãy xem cái này ). Nếu có thể, tôi khuyên bạn nên sử dụng một cột rep_date có cả ngày và giờ và so sánh trực tiếp với cột ngày tối đa.
Nếu đó là một hệ thống đang chạy và bạn không kiểm soát được ngày thay đổi, bạn có thể thử cách này.
trunc(rep_date) = trunc(maxdate) and
to_char(rep_date,'HH24:MI:SS') = to_char(maxdate,'HH24:MI:SS')
Dù bằng cách nào, thời gian đang được lưu trữ không chính xác (như bạn có thể biết từ năm 1753) và có thể có các vấn đề khác trong tương lai.