मुझे लगता है कि RValues
किसी कारण से किसी प्रकार का एक स्ट्रिंग कॉलम है। आपको इसे ठीक करना चाहिए और दिनांक डेटा प्रकार का उपयोग करके दिनांक डेटा संग्रहीत करना चाहिए (जाहिर है कि इस मिश्रित बैग से अलग कॉलम में)।
अगर आप इसे ठीक नहीं कर सकते हैं, तो आप ऊपर बताए गए डेमियन को इसके द्वारा रोक सकते हैं:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(जो "तारीख" को NULL
बना देगा यदि SQL सर्वर यह पता नहीं लगा सकता है कि इसे किसी तिथि में कैसे परिवर्तित किया जाए।)
आप केवल WHERE
. जोड़कर इसे रोक नहीं सकते खंड, क्योंकि SQL सर्वर अक्सर SELECT
. में रूपांतरण का प्रयास करने का प्रयास करेगा फ़िल्टर करने से पहले सूची (सब कुछ योजना पर निर्भर करता है)। आप सबक्वेरी, सीटीई, जॉइन ऑर्डर संकेत आदि का उपयोग करके भी संचालन के क्रम को बाध्य नहीं कर सकते। इस मुद्दे के बारे में एक खुला कनेक्ट आइटम है - वे "इसके बारे में जागरूक हैं" और "भविष्य के संस्करण में इसे संबोधित करने की आशा करते हैं
।"
एक CASE अभिव्यक्ति का छोटा, जो कनवर्ट करने का प्रयास करने से पहले SQL सर्वर को ISDATE() परिणाम का मूल्यांकन करने के लिए मजबूर करता है (जब तक कि किसी भी शाखा में कोई एग्रीगेट मौजूद नहीं है ), आप यह कर सकते हैं:
- फ़िल्टर किए गए परिणामों को #temp तालिका में डंप करें, और उसके बाद बाद में उस #temp तालिका से चयन करें, और केवल तब कनवर्ट करें लागू करें।
- बस स्ट्रिंग वापस करें, और इसे क्लाइंट पर एक तिथि के रूप में मानें, और वहां से YEAR/MONTH आदि भागों को बाहर निकालें
- YEAR =LEFT(col,4) आदि खींचने के लिए बस स्ट्रिंग मैनिपुलेशन का उपयोग करें।
-
TRY_CONVERT()
का उपयोग करें चूँकि मैंने अभी देखा है कि आप SQL Server 2012 पर हैं:TRY_CONVERT(DATE, RValues) AS FechaFirma