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_date
funktionen försöker konvertera det tillbaka till ett datum och behandlar strängen som ett datum skrivet i'DD-MON-YY'
format - sedan
trunc
trunkerar datumet - sedan
to_char
konverterar 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.