मुझे कुछ SQL सर्वर क्वेरीज़ में कोई समस्या है। यह पता चला है कि मेरे पास "Attibute_Name" और "Attibute_Value" फ़ील्ड वाली तालिका है, जो वर्चर में संग्रहीत किसी भी प्रकार का हो सकता है। (हाँ ... मुझे पता है।)डेटाटाइम में रूपांतरण केवल WHERE क्लॉज पर विफल रहता है?
किसी विशेष विशेषता के लिए सभी तिथियां "YYYY-MM-DD hh: mm: ss" प्रारूप को संग्रहीत करती हैं (इसके बारे में 100% निश्चित नहीं है, लाखों हैं यहां रिकॉर्ड) की, तो मैं समस्याओं के बिना इस कोड को निष्पादित कर सकते हैं:
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_Name = 'SomeDate'
हालांकि, अगर मैं निम्नलिखित कोड निष्पादित करें:
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_Name = 'SomeDate'
and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()
मैं निम्न त्रुटि प्राप्त होगा: जब परिवर्तित रूपांतरण विफल चरित्र स्ट्रिंग से दिनांक और/या समय।
यह कहां से खंड पर विफल रहता है और चयनकर्ता पर नहीं?
एक और सुराग:
बजाय अगर ATTRIBUTE_NAME मैं डेटाबेस (पी) में संग्रहीत वास्तविक Attribute_ID यह समस्या के बिना काम करेंगे का उपयोग के आधार पर फ़िल्टर।
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_ID = 15
and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()
अद्यतन जवाब के लिए सभी को धन्यवाद। मुझे वास्तव में सही उत्तर चुनना मुश्किल लगता है क्योंकि हर किसी ने इस मुद्दे को समझने के लिए उपयोगी कुछ बताया। यह निश्चित रूप से निष्पादन के आदेश के साथ करना था। यह पता चला है कि मेरी पहली क्वेरी सही तरीके से काम करती है क्योंकि WHERE क्लॉज पहले निष्पादित किया गया था, फिर चयन करें। मेरी दूसरी क्वेरी उसी कारण से विफल रही (क्योंकि गुण फ़िल्टर नहीं किए गए थे, वही WHERE खंड निष्पादित करते समय रूपांतरण विफल हुआ)। मेरी तीसरी क्वेरी काम करती है क्योंकि आईडी इंडेक्स (पीके) का हिस्सा था, इसलिए इसे प्राथमिकता मिली और इससे पहले उस स्थिति पर परिणाम कम हो गए।
धन्यवाद!
एक और विशेषता 'sOmeDaTe' कहा जाता है है - आप एक केस संवेदी मिलान का उपयोग कर रहे मामले में? शायद यह आपके जुड़ने में गड़बड़ कर रहा है। – YetAnotherUser
आप 'WHERE' खंड में भविष्यवाणियों के किसी प्रकार का संक्षिप्त सर्किट मूल्यांकन या गारंटीकृत आदेश मानते हुए प्रतीत होते हैं। यह गारंटी नहीं है। जब आपके पास कॉलम में मिश्रित डेटाटाइप होते हैं जैसे कि उन्हें निपटने का एकमात्र सुरक्षित तरीका 'केस' अभिव्यक्ति के साथ होता है। –
पीएचए कौन सी तालिका है? यदि पीएचए पीए की तुलना में एक अलग तालिका है तो ऐसा लगता है कि पीएचए के डेटा में कुछ अपरिवर्तनीय रिकॉर्ड हैं, जहां पीए की नहीं है। – N0Alias