1.
To_Date(To_Char(MaxDate, 'DD/MM/YYYY')) = REP_DATE
powoduje problem. jeśli użyjesz to_date bez formatu czasu, Oracle użyje do konwersji bieżącego formatu NLS sesji, który w twoim przypadku może nie być „DD/MM/RRRR”. Sprawdź to...
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.
Co ważniejsze, dlaczego konwertujesz na char, a następnie na datę, zamiast bezpośrednio porównywać
MaxDate = REP_DATE
Jeśli chcesz zignorować składnik czasu w MaxDate przed porównaniem, powinieneś użyć...
trunc(MaxDate ) = rep_date
zamiast tego.
==Aktualizacja:na podstawie zaktualizowanego pytania.
Rep_Date = 01/04/2009 Rep_Time = 01/01/1753 13:00:00
Myślę, że problem jest bardziej złożony. jeśli rep_time ma być tylko czasem, to nie możesz przechowywać go w bazie danych jako daty. Musiałby to być ciąg znaków lub przedział czasowy lub liczbowo jako sekundy (dzięki Alex, patrz to ) . Jeśli to możliwe, sugerowałbym użycie jednej kolumny rep_date, która zawiera zarówno datę, jak i godzinę, i porównaj ją bezpośrednio z kolumną maksymalnej daty.
Jeśli jest to uruchomiony system i nie masz kontroli nad repdate, możesz spróbować tego.
trunc(rep_date) = trunc(maxdate) and
to_char(rep_date,'HH24:MI:SS') = to_char(maxdate,'HH24:MI:SS')
Tak czy inaczej, czas jest przechowywany nieprawidłowo (jak można stwierdzić od roku 1753) i mogą pojawić się inne problemy.