Twoja praca z datami jest całkowicie niepoprawna. Trudno wskazać dokładne miejsce, ponieważ jest kilka potencjalnych miejsc. Wyjaśnię, co jest nie tak z tym fragmentem kodu (jest on wzięty z twojego „linii 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
ma format daty (zgodnie z wyciągiem DDL). Ale to_date
funkcja przyjmuje ciąg znaków jako pierwszy parametr. W tym miejscu Oracle wykonuje następujące czynności:
- domyślnie konwertuje datę na ciąg (używając formatu sesji)
- następnie
to_date
funkcja próbuje przekonwertować go z powrotem na datę, traktując ciąg jako datę zapisaną w'DD-MON-YY'
format - następnie
trunc
skraca datę - następnie
to_char
konwertuje go ponownie na łańcuch, a następnie porównujesz swój łańcuch z datą (chyba)FP_BASIC_BD."DATE"
- jeśli
FP_BASIC_BD."DATE"
jest datą, Oracle ponownie zamienia wynik wyrażenia po prawej stronie znaku równości na datę - lub jeśli
FP_BASIC_BD."DATE"
jest ciągiem, Oracle porównuje ciągi zgodnie z regułami porównywania ciągów.
To, czego potrzebujesz, to pozbyć się wszystkich niepotrzebnych przekształceń:
FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')
A potem musisz dokładnie sprawdzić wszystkie inne wyciągi, w których pracujesz z datami. Jeśli funkcja przyjmuje datę jako parametr wejściowy, musisz przekazać datę, jeśli funkcja przyjmuje ciąg - przekaż ciąg. To samo z porównaniami:porównaj ciąg z ciągiem i datę z datą.