Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle:kein gültiger Monat

1.

To_Date(To_Char(MaxDate, 'DD/MM/YYYY')) = REP_DATE

verursacht das Problem. Wenn Sie to_date ohne das Zeitformat verwenden, verwendet Oracle das NLS-Format der aktuellen Sitzung zum Konvertieren, das in Ihrem Fall möglicherweise nicht "TT/MM/JJJJ" lautet. Überprüfen Sie dies...

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.

Noch wichtiger ist, warum konvertieren Sie zu char und dann zu Datum, anstatt direkt

zu vergleichen
MaxDate = REP_DATE

Wenn Sie die Zeitkomponente in MaxDate vor dem Vergleich ignorieren möchten, sollten Sie verwenden..

trunc(MaxDate ) = rep_date

stattdessen.

==Update :basierend auf aktualisierter Frage.

Rep_Date = 01/04/2009 Rep_Time = 01/01/1753 13:00:00

Ich denke, das Problem ist komplexer. Wenn rep_time nur Zeit sein soll, können Sie es nicht als Datum in der Datenbank speichern. Es müsste eine Zeichenfolge oder ein Datum für ein Zeitintervall oder numerisch als Sekunden sein (danke an Alex, siehe dies ) . Wenn möglich, würde ich vorschlagen, eine Spalte rep_date zu verwenden, die sowohl das Datum als auch die Uhrzeit enthält, und sie direkt mit der Spalte max date zu vergleichen.

Wenn es sich um ein laufendes System handelt und Sie keine Kontrolle über repdate haben, können Sie dies versuchen.

trunc(rep_date) = trunc(maxdate) and 
to_char(rep_date,'HH24:MI:SS') = to_char(maxdate,'HH24:MI:SS')

In jedem Fall wird die Zeit falsch gespeichert (wie Sie am Jahr 1753 erkennen können) und es könnten in Zukunft andere Probleme auftreten.