Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

वर्चर के रूप में संग्रहीत तिथियों की तुलना करना

दिनांक मानों को वर्चर के रूप में संग्रहीत करना गलत है।

यदि संभव हो, तो आपको उन्हें दिनांक डेटा प्रकार के रूप में संग्रहीत करने के लिए तालिका में परिवर्तन करना चाहिए।
आप इसे कुछ सरल चरणों में कर सकते हैं:

  1. वर्तमान कॉलम का नाम बदलें (मुझे लगता है कि शेड्यूलस्टार्टडेट भी वर्कर है) कॉलमनाम_ओल्ड पर। यह sp_rename . का उपयोग करके आसानी से किया जा सकता है ।

  2. तालिका बदलें Use का उपयोग करें उपयुक्त डेटा प्रकार के साथ कॉलम जोड़ने के लिए।

  3. अपडेट स्टेटमेंट का उपयोग करके पुराने कॉलम के मानों को नए कॉलम में कॉपी करें। चूंकि सभी तिथियां एक ही प्रारूप में संग्रहीत हैं, आप कन्वर्ट . का उपयोग कर सकते हैं इस तरह: शेड्यूलस्टार्टडेट सेट करें =कन्वर्ट (दिनांक, NULLIF (ltrim (rtrim (ScheduleStartDate_old)), ''), 103) यदि आपका sql सर्वर संस्करण 2012 या उच्चतर है, तो try_convert . का उपयोग करें . ध्यान दें कि मैंने nullif . का उपयोग किया है , एलट्रिम और आरट्रिम उन मानों को परिवर्तित करने के लिए जिनमें केवल सफेद रिक्त स्थान होते हैं शून्य में।
  4. इन कॉलम को संदर्भित करने वाले इंडेक्स को ड्रॉप और रीक्रिएट करें। ऐसा करने का सबसे आसान तरीका है SSMS पर अनुक्रमणिका पर राइट-क्लिक करना और स्क्रिप्ट अनुक्रमणिका के रूप में चुनें। -> छोड़ें और बनाएं
  5. टेबल बदलें का उपयोग करें पुराने कॉलम हटाने के लिए।

नोट: यदि इन कॉलमों को डेटाबेस पर किसी अन्य ऑब्जेक्ट में संदर्भित किया जा रहा है तो आपको इन ऑब्जेक्ट्स को भी बदलना होगा। इसमें संग्रहीत कार्यविधियाँ, विदेशी कुंजियाँ आदि शामिल हैं।

यदि आप डेटा प्रकार नहीं बदल सकते हैं स्तंभों की, और आपका 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 सर्वर को इन कॉलम पर किसी भी इंडेक्सिंग का उपयोग करने से रोका जा सकेगा।
यह एक और कारण है कि आपको अपने कॉलम को उपयुक्त डेटा प्रकार में क्यों बदलना चाहिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Azure पर SQL सर्वर के साथ शुरुआत कैसे करें

  2. फ़ाइल का नाम और पूर्ण पथ से पथ पार्स करें

  3. SQL सर्वर प्रबंधन स्टूडियो (SSMS) में टेम्प्लेट का उपयोग कैसे करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 16

  4. कॉमा से अलग किए गए कॉलम के मान को पंक्तियों में बदलें

  5. उन्नत उपयोगकर्ताओं के लिए SQL सर्वर 2016 में पूर्ण-पाठ खोज लागू करना