Ditt arbete med datum är helt felaktigt. Det är svårt att ange exakt plats eftersom det finns några potentiella platser. Jag ska förklara vad som är fel med denna kodbit (den är hämtad från din "rad 89"-sats):
... 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 datumformat (enligt din DDL-sats). Men to_date funktion tar en sträng som en första parameter. På den här platsen gör Oracle följande:
- konverterar implicit datum till sträng (med sessionens format)
- sedan
to_datefunktionen försöker konvertera det tillbaka till ett datum och behandlar strängen som ett datum skrivet i'DD-MON-YY'format - sedan
trunctrunkerar datumet - sedan
to_charkonverterar den igen till en sträng, och sedan jämför du din sträng med datumet (antar jag)FP_BASIC_BD."DATE" - om
FP_BASIC_BD."DATE"är ett datum konverterar Oracle implicit resultatet av uttrycket till höger om likhetstecken igen till ett datum - eller om
FP_BASIC_BD."DATE"är en sträng, jämför Oracle strängar enligt reglerna för en strängjämförelse.
Vad du behöver här är att bli av med alla onödiga transformationer:
FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')
Och efter det måste du noga kontrollera alla andra påståenden där du arbetar med datum. Om en funktion tar ett datum som indataparameter måste du skicka ett datum, om en funktion tar en sträng - skicka en sträng. Samma sak med jämförelser:jämför en sträng med en sträng och ett datum med ett datum.