अद्यतन:
मुझे Oracle समर्थन साइट पर इस विशिष्ट प्रकार के DATE भ्रष्टाचार का कोई प्रकाशित संदर्भ नहीं मिला। (यह हो सकता है, मेरी त्वरित खोजों ने इसे चालू नहीं किया।)
- भ्रष्ट तिथियों के लिए डेटाबेस की जांच करने के लिए खराब स्क्रिप्ट [आईडी 95402.1]
- बग 2790435 - समानांतर चयन और प्रकार रूपांतरण के साथ सीरियल INSERT भ्रष्ट डेटा सम्मिलित कर सकता है [ID 2790435.8]
DUMP() फ़ंक्शन से आउटपुट दिखा रहा है कि दिनांक मान वास्तव में अमान्य है:
Typ=12 Len=7: 120,110,11,18,13,0,16
हम उम्मीद करते हैं कि मिनट बाइट एक और साठ के बीच का मान होना चाहिए, शून्य नहीं।
DATE मान के 7 बाइट्स, क्रम में, शताब्दी (+100), वर्ष (+100), माह, दिन, घंटा (+1), मिनट (+1), सेकंड (+1) का प्रतिनिधित्व करते हैं।
केवल एक बार जब मैंने एक प्रो * सी प्रोग्राम (जहां आंतरिक 7 बाइट प्रतिनिधित्व में बाइंड वैल्यू की आपूर्ति की जाती है, पूरी तरह से सामान्य सत्यापन दिनचर्या को छोड़कर, एक DATE मान को बाइंड वैरिएबल के रूप में आपूर्ति की जा रही थी, तो इस तरह से अमान्य DATE मान देखे गए हैं। अमान्य तिथियों को पकड़ें जैसे कि 30 फरवरी)
आपके द्वारा पोस्ट किए गए Oracle सिंटैक्स को देखते हुए, आपके द्वारा देखे जा रहे व्यवहार की अपेक्षा करने का कोई कारण नहीं है।
यह या तो एक नकली विसंगति है (स्मृति भ्रष्टाचार?) या यदि यह दोहराने योग्य है, तो यह Oracle कोड में एक दोष (बग) है। यदि यह Oracle कोड में एक दोष है, तो सबसे अधिक संभावित संदिग्धों में बिना पैच वाली रिलीज़ में "नई" विशेषताएं होंगी।
(मुझे पता है कि CAST एक मानक SQL फ़ंक्शन है जो अन्य डेटाबेस में उम्र के आसपास रहा है। मुझे लगता है कि मैं पुराना स्कूल हूं, और इसे अपने Oracle-सिंटैक्स प्रदर्शनों की सूची में कभी पेश नहीं किया है। मुझे नहीं पता कि Oracle का कौन सा संस्करण था कास्ट की शुरुआत की, लेकिन मैं इससे पहले रिलीज में इससे दूर रहा होता।)
बड़ा 'लाल झंडा' (जिसे एक अन्य टिप्पणीकार ने नोट किया) वह है CAST( datecol AS DATE)
।
आप उम्मीद करेंगे कि अनुकूलक इसे date_col के बराबर मानेगा ... लेकिन पिछला अनुभव हमें दिखाता है कि TO_NUMBER( number_col )
वास्तव में अनुकूलक द्वारा TO_NUMBER( TO_CHAR ( number_col ) )
के रूप में व्याख्या की जाती है ।
मुझे संदेह है कि उस अनावश्यक कास्ट के साथ भी कुछ ऐसा ही हो रहा होगा।
आपके द्वारा दिखाए गए एक रिकॉर्ड के आधार पर, मुझे संदेह है कि समस्या मिनटों या सेकंड के लिए "59" मान वाले मानों के साथ है, और संभवत:घंटों के लिए "23" मान, त्रुटि दिखाने वाले मान होंगे।
मैं उन स्थानों की जाँच करने की कोशिश करूँगा जहाँ मिनट, घंटे या सेकंड 0 के रूप में संग्रहीत हैं:
SELECT id, DUMP(activitydate)
FROM newtable
WHERE DUMP(activitydate) LIKE '%,0,%'
OR DUMP(activitydate) LIKE '%,0'