Vaše práce s daty je zcela nesprávná. Je těžké určit přesné místo, protože existuje několik potenciálních míst. Vysvětlím, co je špatného na tomto kousku kódu (je převzat z vašeho příkazu „řádek 89“):
... FP_BASIC_BD."DATE">=TO_CHAR(TRUNC(TO_DATE(GTT_DWM_STATS.CLOSINGDATE,'DD-MON-YY'), 'IW'),'DD-MON-YY') ...
GTT_DWM_STATS.CLOSINGDATE má formát data (podle vašeho výpisu DDL). Ale to_date funkce bere řetězec jako první parametr. Na tomto místě Oracle provede následující:
- implicitně převádí datum na řetězec (pomocí formátu relace)
- poté
to_datefunkce se jej pokusí převést zpět na datum, přičemž zachází s řetězcem jako s datem zapsaným v'DD-MON-YY'formát - poté
trunczkrátí datum - poté
to_charpřevede jej znovu na řetězec a poté svůj řetězec porovnáte s datem (myslím)FP_BASIC_BD."DATE" - pokud
FP_BASIC_BD."DATE"je datum, Oracle implicitně převede výsledek výrazu napravo od rovnítka opět na datum - nebo pokud
FP_BASIC_BD."DATE"je řetězec, Oracle porovnává řetězce podle pravidel porovnávání řetězců.
Co zde potřebujete, je zbavit se všech zbytečných transformací:
FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')
A poté musíte pečlivě zkontrolovat všechny ostatní výpisy, kde pracujete s daty. Pokud funkce bere datum jako vstupní parametr, musíte předat datum, pokud funkce bere řetězec - předejte řetězec. Totéž s porovnáním:porovnejte řetězec s řetězcem a datum s datem.