Je werk met datums is totaal onjuist. Het is moeilijk om de exacte plaats aan te wijzen, omdat er enkele potentiële plaatsen zijn. Ik zal uitleggen wat er mis is met dit stukje code (het is overgenomen uit je "regel 89"-statement):
... FP_BASIC_BD."DATE">=TO_CHAR(TRUNC(TO_DATE(GTT_DWM_STATS.CLOSINGDATE,'DD-MON-YY'), 'IW'),'DD-MON-YY') ...
GTT_DWM_STATS.CLOSINGDATE
heeft een datumnotatie (volgens uw DDL-verklaring). Maar to_date
functie neemt een string als eerste parameter. Op deze plaats doet Oracle het volgende:
- converteert impliciet datum naar tekenreeks (in de sessie-indeling)
- vervolgens
to_date
functie probeert het weer om te zetten in een datum en behandelt de string als een datum geschreven in'DD-MON-YY'
formaat - vervolgens
trunc
kapt de datum af - vervolgens
to_char
zet het weer om in een string, en dan vergelijk je je string met de datum (denk ik)FP_BASIC_BD."DATE"
- if
FP_BASIC_BD."DATE"
een datum is, zet Oracle impliciet het resultaat van de uitdrukking rechts van het gelijkteken weer om in een datum - of als
FP_BASIC_BD."DATE"
is een string, Oracle vergelijkt strings volgens de regels van een stringvergelijking.
Wat je hier nodig hebt, is om alle onnodige transformaties kwijt te raken:
FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')
En daarna moet je alle andere overzichten waar je met datums werkt goed controleren. Als een functie een datum als invoerparameter heeft, moet u een datum doorgeven, als een functie een string nodig heeft - geef een string door. Hetzelfde geldt voor vergelijkingen:vergelijk een string met een string en een datum met een datum.