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

दिनांक सीमाओं की तुलना करना

यह एक शास्त्रीय समस्या है, और यदि आप तर्क को उलट दें तो यह वास्तव में आसान है।

मैं आपको एक उदाहरण देता हूं।

मैं यहां एक समयावधि, और अन्य अवधियों की सभी विभिन्न विविधताएं पोस्ट करूंगा जो किसी न किसी तरह से ओवरलैप होती हैं।

           |-------------------|          compare to this one
               |---------|                contained within
           |----------|                   contained within, equal start
                   |-----------|          contained within, equal end
           |-------------------|          contained within, equal start+end
     |------------|                       not fully contained, overlaps start
                   |---------------|      not fully contained, overlaps end
     |-------------------------|          overlaps start, bigger
           |-----------------------|      overlaps end, bigger
     |------------------------------|     overlaps entire period

दूसरी ओर, मुझे उन सभी को पोस्ट करने दें जो ओवरलैप नहीं करते हैं:

           |-------------------|          compare to this one
     |---|                                ends before
                                 |---|    starts after

इसलिए यदि आप तुलना को सरल रूप से कम करते हैं:

starts after end
ends before start

फिर आपको वे सभी मिलेंगे जो ओवरलैप नहीं करते हैं, और फिर आपको सभी गैर-मिलान अवधियां मिलेंगी।

आपके अंतिम NOT IN LIST उदाहरण के लिए, आप देख सकते हैं कि यह उन दो नियमों से मेल खाता है।

आपको यह तय करना होगा कि निम्नलिखित अवधियां आपकी सीमाओं के अंदर या बाहर हैं:

           |-------------|
   |-------|                       equal end with start of comparison period
                         |-----|   equal start with end of comparison period

यदि आपकी तालिका में रेंज_एंड और रेंज_स्टार्ट नामक कॉलम हैं, तो सभी मिलान पंक्तियों को पुनः प्राप्त करने के लिए यहां कुछ सरल एसक्यूएल है:

SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
           OR range_end < @check_period_start)

नोट करें नहीं वहाँ पर। चूंकि दो सरल नियमों में सभी गैर-मिलान मिलते हैं पंक्तियाँ, एक साधारण NOT इसे यह कहने के लिए उलट देगा:यदि यह गैर-मिलान वाली पंक्तियों में से एक नहीं है, तो इसे मेल खाने वाली पंक्तियों में से एक होना चाहिए

नॉट से छुटकारा पाने के लिए यहां सरल रिवर्सल लॉजिक लागू करना और आप इसके साथ समाप्त हो जाएंगे:

SELECT *
FROM periods
WHERE range_start <= @check_period_end
      AND range_end >= @check_period_start


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql तालिका नाम में (-) डैश का उपयोग करना

  2. त्रुटि 1046 कोई डेटाबेस चयनित नहीं, कैसे हल करें?

  3. MySQL में डेटा को नई तालिका में कॉपी करें

  4. जावा JDBC MySQL अपवाद:परिणामसेट बंद होने के बाद ऑपरेशन की अनुमति नहीं है

  5. बिना पासवर्ड प्रॉम्प्ट के उबंटू पर MySQL इंस्टॉल करें