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

मैं एक पंक्ति में अतिव्यापी मूल्यों की तुलना कैसे करूं?

शाहकलपेश ने इस प्रश्न का उत्तर इसके साथ दिया:

मैंने एक टिप्पणी पोस्ट की है कि मैं इसे गलत मानता हूं, एक जोड़ी प्रति-उदाहरण देता हूं:

मेरी टिप्पणी के जवाब में, शाहकल्पेश ने अनुरोध किया:

काफी उचित - हाँ। थोड़ा संपादित, प्रश्न कहता है:

  • सुबह 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')। यह अभिव्यक्ति 'ओवरलैप', 'मीट' और 'मेट बाय' की गिनती करने वाली पंक्तियों का चयन करने का एक आदर्श उदाहरण है (देखें "एलन का अंतराल बीजगणित ", उदाहरण के लिए) ओवरलैपिंग के रूप में। '>=' और '<=' को बदलने से ओवरलैपिंग के रूप में गिने जाने वाले अंतरालों का सेट बदल जाता है।



  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. MySQL में एक कॉलम में गैर-संख्यात्मक मान कैसे खोजें

  3. कैसे पता चलेगा कि mysql INSERT कब समाप्त हो गया है (एकाधिक कनेक्शन)

  4. डेटाबेस इतिहास

  5. मैसकल कॉलम की बाधा खाली/आवश्यक नहीं है