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

निश्चित तिथि सीमा के लिए MySQL क्वेरी

यह आश्चर्यजनक है कि लगभग दो वर्षों तक किसी ने इस पर ध्यान नहीं दिया, लेकिन अन्य सभी उत्तर गलत हैं क्योंकि उन्होंने उस मामले पर ध्यान नहीं दिया जब प्रारंभ तिथि और समाप्ति तिथि दोनों ही खोज सीमा के दायरे से बाहर हो जाते हैं। विचार करें कि यह तिथि की सीमा है:

start_date <<---------------------------- date range --------------------------->> end_date

और यह हमारी खोज का दायरा है:

start_date <<---------------------------- date range --------------------------->> end_date

                 start_search <<-------- search range -------->> end_search

खोज हमें सकारात्मक परिणाम देना चाहिए क्योंकि वे प्रतिच्छेद करते हैं। लेकिन यदि आप अन्य उत्तरों का उपयोग करते हैं, तो आपको एक नकारात्मक परिणाम मिलेगा क्योंकि न तो start_date न ही end_date start_search . के बीच है और end_search

समाधान प्राप्त करने के लिए, आइए सभी 4 संभावित मोड को ड्रा करें चौराहे का:

                  start_date <<---------- date range --------------------------->> end_date

start_search <<------------------------- search range -------->> end_search
start_date <<---------------------------- date range ---------->> end_date

               start_search <<---------- search range ------------------------>> end_search
start_date <<---------------------------- date range --------------------------->> end_date

                 start_search <<-------- search range -------->> end_search
                 start_date <<----------- date range -------->> end_date

start_search <<------------------------- search range ------------------------>> end_search

आप OR कर सकते हैं सीधा समाधान पाने के लिए सभी 4 संभावित मामले:

select*from table where

   /* 1st case */ start_date between start_search and end_search         
or /* 2nd case */  end_date  between start_search and end_search         
or /* 3rd case */ (start_date <= start_search and end_date >= end_search)
or /* 4th case */ (start_date >= start_search and end_date <= end_search)

/* the 4th case here is actually redundant since it is being covered by the 1st and 2nd cases */

एक कम सीधा समाधान है:

select*from table where

    start_date  between start_search and end_search /* covers 1st and 4th cases */          
or start_search between  start_date  and  end_date  /* covers 2nd and 3rd cases */

ऊपर दिए गए आरेखों का उपयोग करके इसकी कल्पना करने का प्रयास करें।

यदि हम ऊपर दिए गए 4 आरेखों में से एक पैटर्न को एक्सट्रपलेशन करने का प्रयास करते हैं, तो हम देख सकते हैं कि एक चौराहे के दौरान, end_date हमेशा होता है >= start_search , और दूसरी तरफ, start_date हमेशा होता है <= end_search . वास्तव में, आगे की कल्पना करते हुए, हम देख सकते हैं कि जब वे दो स्थितियां होती हैं, तो हमारे पास एक चौराहा नहीं हो सकता है .

जैसे, एक और उपाय उतना ही सरल है:

select*from table where

end_date >= start_search && start_date <= end_search

और इस समाधान का लाभ यह है कि हमें केवल 2 तुलनाओं की आवश्यकता है। इसकी तुलना "OR . से करें सब कुछ" दृष्टिकोण जिसमें 2 से लेकर 8 तक (3 + 3 + 2) तुलना की आवश्यकता होती है। (प्रत्येक between कॉल में 3 तुलना शामिल हैं ।)



  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 - जब नेस्टेड चयन उस तालिका का उपयोग करता है तो तालिका से कैसे हटाएं?

  4. MySql में किसी तालिका से अंतिम रिकॉर्ड (शर्त पर) कैसे हटाएं?

  5. उपयोगकर्ता नाम द्वारा Laravel में उपयोगकर्ता खोजें