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_date
funkce 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é
trunc
zkrátí datum - poté
to_char
př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.