Công việc của bạn với ngày tháng là hoàn toàn không chính xác. Thật khó để chỉ ra địa điểm chính xác vì có một số địa điểm tiềm năng. Tôi sẽ giải thích điều gì sai với đoạn mã này (nó được lấy từ câu lệnh "dòng 89" của bạn):
... FP_BASIC_BD."DATE">=TO_CHAR(TRUNC(TO_DATE(GTT_DWM_STATS.CLOSINGDATE,'DD-MON-YY'), 'IW'),'DD-MON-YY') ...
GTT_DWM_STATS.CLOSINGDATE
có định dạng ngày tháng (theo tuyên bố DDL của bạn). Nhưng to_date
hàm nhận một chuỗi làm tham số đầu tiên. Tại nơi này, Oracle thực hiện những điều sau:
- chuyển đổi ngầm định ngày thành chuỗi (sử dụng định dạng của phiên)
- rồi đến
to_date
hàm cố gắng chuyển đổi nó trở lại thành một ngày tháng, coi chuỗi là một ngày tháng được viết bằng'DD-MON-YY'
định dạng - sau đó
trunc
cắt bớt ngày - sau đó
to_char
chuyển đổi lại nó thành một chuỗi và bạn so sánh chuỗi của mình với ngày (tôi đoán)FP_BASIC_BD."DATE"
- if
FP_BASIC_BD."DATE"
là ngày tháng, Oracle chuyển đổi ngầm kết quả của biểu thức ở bên phải dấu bằng một lần nữa thành ngày tháng - hoặc nếu
FP_BASIC_BD."DATE"
là một chuỗi, Oracle so sánh các chuỗi theo quy tắc so sánh chuỗi.
Những gì bạn cần ở đây là loại bỏ tất cả các biến đổi không cần thiết:
FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')
Và sau đó bạn phải kiểm tra cẩn thận tất cả các báo cáo khác mà bạn đang làm việc với ngày tháng. Nếu một hàm lấy một ngày làm tham số đầu vào, bạn phải chuyển một ngày tháng, nếu một hàm lấy một chuỗi - hãy truyền một chuỗi. Tương tự với phép so sánh:so sánh một chuỗi với một chuỗi và một ngày với một ngày.