Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle:não é um mês válido


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

está causando o problema. quando você usa to_date sem o formato de hora, o oracle usará o formato NLS da sessão atual para converter, que no seu caso pode não ser "DD/MM/AAAA". Verifique isso...
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.

Mais importante, por que você está convertendo para char e depois para data, em vez de comparar diretamente
MaxDate = REP_DATE

Se você quiser ignorar o componente de hora em MaxDate antes da comparação, você deve usar ..
trunc(MaxDate ) = rep_date

em vez de.

==Atualização:com base na pergunta atualizada.
Rep_Date = 01/04/2009 Rep_Time = 01/01/1753 13:00:00

Acho que o problema é mais complexo. se rep_time pretende ser apenas tempo, então você não pode armazená-lo no banco de dados como uma data. Teria que ser uma string ou data para intervalo de tempo ou numericamente como segundos (graças a Alex, veja isto ). Se possível, sugiro usar uma coluna rep_date que tenha a data e a hora e compará-la diretamente com a coluna de data máxima.

Se é um sistema em execução e você não tem controle sobre repdate, você pode tentar isso.
trunc(rep_date) = trunc(maxdate) and 
to_char(rep_date,'HH24:MI:SS') = to_char(maxdate,'HH24:MI:SS')

De qualquer forma, a hora está sendo armazenada incorretamente (como você pode ver no ano de 1753) e pode haver outros problemas no futuro.