Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle:mese non valido

1.

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

sta causando il problema. quando usi to_date senza il formato dell'ora, Oracle utilizzerà il formato NLS delle sessioni correnti per la conversione, che nel tuo caso potrebbe non essere "GG/MM/AAAA". Controlla questo...

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.

Ancora più importante, perché stai convertendo in char e poi in data, invece di confrontare direttamente

MaxDate = REP_DATE

Se vuoi ignorare la componente temporale in MaxDate prima del confronto, dovresti usare..

trunc(MaxDate ) = rep_date

invece.

==Aggiorna:in base alla domanda aggiornata.

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

Penso che il problema sia più complesso. se rep_time deve essere solo tempo, non è possibile memorizzarlo nel database come data. Dovrebbe essere una stringa o un intervallo di tempo o numericamente come secondi (grazie ad Alex, vedere questo ). Se possibile, suggerirei di utilizzare una colonna rep_date che contenga sia la data che l'ora e confrontarla direttamente con la colonna della data massima.

Se è un sistema in esecuzione e non hai il controllo su repdate, puoi provare questo.

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

In ogni caso, l'ora viene memorizzata in modo errato (come puoi vedere dall'anno 1753) e potrebbero esserci altri problemi in futuro.