तारीखों के साथ आपका काम पूरी तरह गलत है। सटीक स्थान बताना कठिन है क्योंकि कुछ संभावित स्थान हैं। मैं समझाता हूँ कि इस कोड में क्या गलत है (यह आपके "लाइन 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
दिनांक स्वरूप है (आपके डीडीएल विवरण के अनुसार)। लेकिन to_date
फ़ंक्शन पहले पैरामीटर के रूप में एक स्ट्रिंग लेता है। इस स्थान पर, Oracle निम्न कार्य करता है:
- अनिवार्य रूप से दिनांक को स्ट्रिंग में परिवर्तित करता है (सत्र के प्रारूप का उपयोग करके)
- फिर
to_date
फ़ंक्शन इसे वापस एक तारीख में बदलने की कोशिश करता है, स्ट्रिंग को'DD-MON-YY'
में लिखी गई तारीख के रूप में मानता है। प्रारूप - फिर
trunc
तारीख को छोटा करता है - फिर
to_char
इसे फिर से एक स्ट्रिंग में परिवर्तित करता है, और आप अपनी स्ट्रिंग की तुलना दिनांक (मुझे लगता है)FP_BASIC_BD."DATE"
से करते हैं। - अगर
FP_BASIC_BD."DATE"
एक तिथि है, Oracle परोक्ष रूप से अभिव्यक्ति के परिणाम को समान चिह्न के दाईं ओर फिर से एक तिथि में परिवर्तित करता है - या अगर
FP_BASIC_BD."DATE"
एक स्ट्रिंग है, Oracle स्ट्रिंग तुलना के नियमों के अनुसार स्ट्रिंग्स की तुलना करता है।
सभी अनावश्यक परिवर्तनों से छुटकारा पाने के लिए आपको यहां क्या चाहिए:
FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')
और उसके बाद आपको अन्य सभी स्टेटमेंट को ध्यान से देखना होगा जहां आप तारीखों के साथ काम कर रहे हैं। यदि कोई फ़ंक्शन इनपुट पैरामीटर के रूप में दिनांक लेता है, तो आपको एक तिथि पास करनी होगी, यदि कोई फ़ंक्शन एक स्ट्रिंग लेता है - एक स्ट्रिंग पास करें। तुलना के साथ भी ऐसा ही है:एक स्ट्रिंग की तुलना एक स्ट्रिंग से करें और एक तिथि की एक तिथि के साथ तुलना करें।