Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle :pas un mois valide

1.

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

est à l'origine du problème. lorsque vous utilisez to_date sans le format d'heure, oracle utilisera le format NLS des sessions actuelles pour convertir, qui dans votre cas pourrait ne pas être "JJ/MM/AAAA". Vérifiez ceci...

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.

Plus important encore, pourquoi convertissez-vous en char puis en date, au lieu de comparer directement

MaxDate = REP_DATE

Si vous souhaitez ignorer le composant de temps dans MaxDate avant la comparaison, vous devez utiliser..

trunc(MaxDate ) = rep_date

à la place.

==Mise à jour :basée sur la question mise à jour.

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

Je pense que le problème est plus complexe. si rep_time est destiné à n'être que du temps, vous ne pouvez pas le stocker dans la base de données en tant que date. Il faudrait que ce soit une chaîne ou un intervalle de date à heure ou numériquement en secondes (merci à Alex, voir ceci ). Si possible, je suggérerais d'utiliser une colonne rep_date contenant à la fois la date et l'heure et de la comparer directement à la colonne de date maximale.

S'il s'agit d'un système en cours d'exécution et que vous n'avez aucun contrôle sur repdate, vous pouvez essayer ceci.

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

Quoi qu'il en soit, l'heure est stockée de manière incorrecte (comme vous pouvez le constater à partir de l'année 1753) et il pourrait y avoir d'autres problèmes à l'avenir.