दिनांक मानों को वर्चर के रूप में संग्रहीत करना गलत है।
यदि संभव हो, तो आपको उन्हें दिनांक डेटा प्रकार के रूप में संग्रहीत करने के लिए तालिका में परिवर्तन करना चाहिए।
आप इसे कुछ सरल चरणों में कर सकते हैं:
-
वर्तमान कॉलम का नाम बदलें (मुझे लगता है कि शेड्यूलस्टार्टडेट भी वर्कर है) कॉलमनाम_ओल्ड पर। यह
sp_rename
. का उपयोग करके आसानी से किया जा सकता है । -
तालिका बदलें
Use का उपयोग करें उपयुक्त डेटा प्रकार के साथ कॉलम जोड़ने के लिए। - अपडेट स्टेटमेंट का उपयोग करके पुराने कॉलम के मानों को नए कॉलम में कॉपी करें। चूंकि सभी तिथियां एक ही प्रारूप में संग्रहीत हैं, आप
कन्वर्ट
. का उपयोग कर सकते हैं इस तरह:शेड्यूलस्टार्टडेट सेट करें =कन्वर्ट (दिनांक, NULLIF (ltrim (rtrim (ScheduleStartDate_old)), ''), 103) यदि आपका sql सर्वर संस्करण 2012 या उच्चतर है, तो
try_convert
. का उपयोग करें . ध्यान दें कि मैंनेnullif
. का उपयोग किया है ,एलट्रिम
औरआरट्रिम
उन मानों को परिवर्तित करने के लिए जिनमें केवल सफेद रिक्त स्थान होते हैं शून्य में। - इन कॉलम को संदर्भित करने वाले इंडेक्स को ड्रॉप और रीक्रिएट करें। ऐसा करने का सबसे आसान तरीका है SSMS पर अनुक्रमणिका पर राइट-क्लिक करना और
स्क्रिप्ट अनुक्रमणिका के रूप में
चुनें। ->छोड़ें और बनाएं
। टेबल बदलें
का उपयोग करें पुराने कॉलम हटाने के लिए।
नोट: यदि इन कॉलमों को डेटाबेस पर किसी अन्य ऑब्जेक्ट में संदर्भित किया जा रहा है तो आपको इन ऑब्जेक्ट्स को भी बदलना होगा। इसमें संग्रहीत कार्यविधियाँ, विदेशी कुंजियाँ आदि शामिल हैं।
यदि आप डेटा प्रकार नहीं बदल सकते हैं स्तंभों की, और आपका sql सर्वर संस्करण 2012 से कम है, आपको इस तरह कन्वर्ट का उपयोग करने की आवश्यकता है:
SELECT * FROM tblServiceUsersSchedule
WHERE CONVERT(DATE, NULLIF(ScheduleEndDate, RTRIM(LTRIM('')), 103)
< CAST(GETDATE() As Date);
AND ScheduleEndDate IS NOT NULL
ध्यान दें कि यदि आपके पास एक भी पंक्ति है जहां कॉलम का डेटा dd/MM/yyyy प्रारूप में नहीं है तो यह एक त्रुटि उत्पन्न करेगा।
sql सर्वर संस्करण 2012 या उच्चतर के लिए, Try_convert
का उपयोग करें . रूपांतरण विफल होने पर यह फ़ंक्शन केवल शून्य वापस आ जाएगा:
SELECT * FROM tblServiceUsersSchedule
WHERE TRY_CONVERT(DATE, NULLIF(ScheduleEndDate, RTRIM(LTRIM('')), 103)
< CAST(GETDATE() As Date);
AND ScheduleEndDate IS NOT NULL
नोट: मैंने उपयोग किया है CAST(GETDATE() as date)
वर्तमान तिथि का समय भाग निकालने के लिए। इसका मतलब है कि आपको केवल वही रिकॉर्ड मिलेंगे जहां ScheduleEndDate
कम से कम एक दिन पुराना है। यदि आप उन रिकॉर्ड्स को भी प्राप्त करना चाहते हैं जहां ScheduleEndDate
आज है, <=
. का प्रयोग करें <
. के बजाय ।
एक अंतिम बात: जहां क्लॉज में कॉलम पर फ़ंक्शन का उपयोग करने से Sql सर्वर को इन कॉलम पर किसी भी इंडेक्सिंग का उपयोग करने से रोका जा सकेगा।
यह एक और कारण है कि आपको अपने कॉलम को उपयुक्त डेटा प्रकार में क्यों बदलना चाहिए।