Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle:невалиден месец

1.

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

причинява проблема. когато използвате to_date без формата за време, oracle ще използва NLS формата на текущите сесии за преобразуване, който във вашия случай може да не е "ДД/ММ/ГГГГ". Проверете това...

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.

По-важното е защо преобразувате в char и след това към днешна дата, вместо да сравнявате директно

MaxDate = REP_DATE

Ако искате да игнорирате времевия компонент в MaxDate преди сравнение, трябва да използвате..

trunc(MaxDate ) = rep_date

вместо това.

==Актуализация:въз основа на актуализиран въпрос.

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

Мисля, че проблемът е по-сложен. ако rep_time е предвидено да бъде само време, тогава не можете да го съхранявате в базата данни като дата. Трябва да бъде низ или дата към интервал от време или цифрово като секунди (благодарение на Алекс, вижте това ) . Ако е възможно, предлагам да използвате една колона rep_date, която съдържа и дата, и час, и да я сравнявате директно с колоната за максимална дата.

Ако това е работеща система и нямате контрол върху repdate, можете да опитате това.

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

И в двата случая времето се съхранява неправилно (както можете да разберете от годината 1753) и може да има други проблеми в бъдеще.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Връщане на краткото име на ден от дата в Oracle

  2. Как да агрегирам без да използвам `GROUP BY`?

  3. Числовият тип данни се показва като # в SQL Plus

  4. Защо Oracle игнорира индекса с ORDER BY?

  5. PL SQL:Как да покажа наносекунди от TIMESTAMP