sql >> Databasteknik >  >> RDS >> Oracle

Oracle:inte en giltig månad

1.

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

orsakar problemet. när du använder to_date utan tidsformatet kommer Oracle att använda nuvarande sessions NLS-format för att konvertera, vilket i ditt fall kanske inte är "DD/MM/ÅÅÅÅ". Kolla detta...

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.

Ännu viktigare, varför konverterar du till char och sedan till datum istället för att direkt jämföra

MaxDate = REP_DATE

Om du vill ignorera tidskomponenten i MaxDate före jämförelse bör du använda..

trunc(MaxDate ) = rep_date

istället.

==Uppdatering:baserat på uppdaterad fråga.

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

Jag tror att problemet är mer komplext. om rep_time är tänkt att endast vara tid, kan du inte lagra det i databasen som ett datum. Det måste vara en sträng eller datum till tidsintervall eller numeriskt som sekunder (tack vare Alex, se detta ) . Om möjligt skulle jag föreslå att du använder en kolumn rep_date som har både datum och tid och jämför den direkt med kolumnen maxdatum.

Om det är ett körande system och du inte har kontroll över repdate kan du prova detta.

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

Hur som helst lagras tiden felaktigt (som du kan se från år 1753) och det kan finnas andra problem framöver.



  1. Mysql:dumpa databas tillsammans med data

  2. hur man sammanfogar 2 bord

  3. hur räknar man rader med första bokstaven?

  4. Nackdelar med att lagra ett heltal som en sträng i en databas