शाहकलपेश ने इस प्रश्न का उत्तर इसके साथ दिया:
मैंने एक टिप्पणी पोस्ट की है कि मैं इसे गलत मानता हूं, एक जोड़ी प्रति-उदाहरण देता हूं:
मेरी टिप्पणी के जवाब में, शाहकल्पेश ने अनुरोध किया:
काफी उचित - हाँ। थोड़ा संपादित, प्रश्न कहता है:
- सुबह 7 बजे से दोपहर 1 बजे तक, या
- सुबह 9 बजे से दोपहर 1 बजे तक, या
- सुबह 9 बजे से शाम 5 बजे तक।
पर्याप्त पृष्ठभूमि। हम नियुक्तियों की तारीख को अनदेखा कर सकते हैं, और केवल समय पर विचार कर सकते हैं। मुझे लगता है कि एचएच:मिमी प्रारूप में दर्ज समय को सीमित करने का एक आसान तरीका है; सभी DBMS वास्तव में यह प्रदान नहीं करते हैं, लेकिन hh:mm:ss को संभालने का विस्तार तुच्छ है।
Appointments
Row timeStart timeEnd Note
1 07:00 13:00 First valid range
2 09:00 13:00 Second valid range
3 09:00 17:00 Third valid range
4 14:00 17:00 First plausibly valid range
5 05:00 06:00 First probably invalid range
6 18:00 22:30 Second probably invalid range
09:00 - 13:00 की सीमा को ओवरलैप करने वाली नियुक्तियों की खोज को देखते हुए, शाहकल्पेश की (सरलीकृत) क्वेरी बन जाती है:
SELECT * FROM Appointments
WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')
यह डेटा की सभी छह पंक्तियों को वापस कर देगा। हालाँकि, केवल पंक्तियाँ 1, 2, 3 ही समयावधि 09:00 - 13:00 को ओवरलैप करती हैं। यदि पंक्तियाँ 1, 2, और 3 ही एकमात्र वैध प्रतिनिधि नियुक्ति मान हैं, तो शाहकल्पेश की क्वेरी सही उत्तर देती है। हालांकि, अगर पंक्ति 4 (जो मुझे लगता है कि काफी मान्य है) की अनुमति है, तो इसे वापस नहीं किया जाना चाहिए। इसी तरह, पंक्तियाँ 5 और 6 - यदि मौजूद हैं - को वापस नहीं किया जाना चाहिए। [असल में, मान कर timeStart <= timeEnd
तालिका में सभी पंक्तियों के लिए (और चीजों को गड़बड़ाने के लिए कोई NULL मान नहीं हैं), हम देख सकते हैं कि शाहकल्पेश की क्वेरी 09:00-13:00 क्वेरी के लिए डेटा की कोई भी पंक्ति लौटाएगी क्योंकि या तो प्रारंभ समय पंक्ति 09:00 से अधिक है या समाप्ति समय 13:00 या दोनों से कम है। यह लिखने के समान है 1 = 1
या WHERE क्लॉज में कोई अन्य टौटोलॉजी। ]
अगर हम शेनड की क्वेरी (सरलीकृत के रूप में) पर विचार करें:
SELECT * FROM Appointments
WHERE timeStart <= '13:00' AND timeEnd >= '09:00'
हम देखते हैं कि यह पंक्तियों 1, 2, और 3 का भी चयन करता है, लेकिन यह 4 पंक्तियों को अस्वीकार करता है (क्योंकि टाइमस्टार्ट> '13:00'), 5 (क्योंकि टाइमएंड <'09:00') और 6 (क्योंकि टाइमस्टार्ट> '13:00')। यह अभिव्यक्ति 'ओवरलैप', 'मीट' और 'मेट बाय' की गिनती करने वाली पंक्तियों का चयन करने का एक आदर्श उदाहरण है (देखें "एलन का अंतराल बीजगणित ", उदाहरण के लिए) ओवरलैपिंग के रूप में। '>=' और '<=' को बदलने से ओवरलैपिंग के रूप में गिने जाने वाले अंतरालों का सेट बदल जाता है।