Dit arbejde med datoer er fuldstændig forkert. Det er svært at udpege et præcist sted, fordi der er nogle potentielle steder. Jeg vil forklare, hvad der er galt med dette stykke kode (det er taget fra din "linje 89"-sætning):
... FP_BASIC_BD."DATE">=TO_CHAR(TRUNC(TO_DATE(GTT_DWM_STATS.CLOSINGDATE,'DD-MON-YY'), 'IW'),'DD-MON-YY') ...
GTT_DWM_STATS.CLOSINGDATE
har datoformat (ifølge din DDL-erklæring). Men to_date
funktion tager en streng som en første parameter. På dette sted gør Oracle følgende:
- konverterer implicit dato til streng (ved hjælp af sessionens format)
- derefter
to_date
funktion forsøger at konvertere den tilbage til en dato, idet den behandler strengen som en dato skrevet i'DD-MON-YY'
format - derefter
trunc
afkorter datoen - derefter
to_char
konverterer den igen til en streng, og derefter sammenligner du din streng med datoen (jeg gætter på)FP_BASIC_BD."DATE"
- hvis
FP_BASIC_BD."DATE"
er en dato, konverterer Oracle implicit resultatet af udtryk til højre for lighedstegn igen til en dato - eller hvis
FP_BASIC_BD."DATE"
er en streng, sammenligner Oracle strenge i henhold til reglerne for en strengsammenligning.
Hvad du har brug for her er at slippe af med alle unødvendige transformationer:
FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')
Og herefter skal du nøje tjekke alle andre udsagn, hvor du arbejder med datoer. Hvis en funktion tager en dato som inputparameter, skal du sende en dato, hvis en funktion tager en streng - videregive en streng. Det samme med sammenligninger:Sammenlign en streng med en streng og en dato med en dato.