यह एक शास्त्रीय समस्या है, और यह वास्तव में आसान है यदि आप तर्क को उलटते हैं।
मैं आपको एक उदाहरण देता हूं।
मैं एक समय की अवधि यहाँ पोस्ट करूँगा, और अन्य अवधियों के सभी विभिन्न रूपांतर जो किसी तरह से ओवरलैप होंगे।
|-------------------| 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
फिर आप उन सभी को खोज लेंगे जो ओवरलैप नहीं करते हैं, और फिर आप सभी गैर-मिलान अवधि पाएंगे।
अपने अंतिम नॉट लिस्ट उदाहरण के लिए, आप देख सकते हैं कि यह उन दो नियमों से मेल खाता है।
आपको यह तय करने की आवश्यकता होगी कि निम्नलिखित अवधि क्या है?
|-------------|
|-------| 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)
वहाँ नोट नहीं । चूंकि दो सरल नियम सभी गैर-मिलान पंक्तियों को ढूंढते हैं, एक साधारण यह कहने के लिए इसे उल्टा नहीं करेगा: यदि यह गैर-मिलान पंक्तियों में से एक नहीं है, तो इसे मिलान वाले में से एक होना चाहिए ।
यहाँ से छुटकारा पाने के लिए सरल उलटा तर्क लागू करना और आप इसे समाप्त कर देंगे:
SELECT *
FROM periods
WHERE range_start <= @check_period_end
AND range_end >= @check_period_start