MySQL "के बीच" खंड समावेशी नहीं है?


142

यदि मैं एक betweenखंड के साथ एक क्वेरी चलाता हूं , तो यह अंतिम मान को बाहर करने के लिए लगता है।
उदाहरण के लिए:

select * from person where dob between '2011-01-01' and '2011-01-31'

यह dob'2011-01-01' से '2011-01-30' तक सभी परिणाम प्राप्त करता है; dob'2011-01-31' के रिकॉर्ड को छोड़ दिया जाए । क्या कोई समझा सकता है कि यह क्वेरी इस तरह से क्यों व्यवहार करती है, और मैं इसे कैसे संशोधित करने के लिए रिकॉर्ड शामिल कर सकता हूं जहां dob'2011-01-31' है? (अंतिम तिथि में 1 जोड़े बिना क्योंकि उपयोगकर्ताओं द्वारा इसका चयन किया गया है।)


नहीं। मैं अपने MySQL स्थापना (संस्करण?) BETWEENदोनों मूल्यों के लिए समावेशी हूं । मेरे पास MySQL Server 5.7विंडोज़ 10.
ग्रीन

जवाबों:


181

फ़ील्ड में dobसंभवतः एक समय घटक होता है।

इसे समाप्त करने के लिए:

select * from person 
where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'

59
इसके बजाय CAST(dob AS DATE)आप अधिक रसीला का उपयोग कर सकते हैं DATE(dob)
jkndrkn

11
जब यह काम करता है, तो आप उपयोग करके >=और <इसके बजाय बेहतर प्रदर्शन प्राप्त करेंगे between
डेविड हरकेंस

112
उपयोग करने से आपको बेहतर प्रदर्शन मिलेगा dob BETWEEN '2011-01-01 00:00:00' AND '2011-01-31 23:59:59। ऐसा इसलिए है क्योंकि DATE(dob)प्रत्येक पंक्ति के लिए एक मूल्य की गणना करना है और उस क्षेत्र पर किसी भी अनुक्रमित का उपयोग नहीं कर सकते हैं।
जोशाहुद्दलंड

2
@joshuahedlund कृपया इस समाधान के साथ एक उत्तर जोड़ें। कास्ट लगभग कुशल नहीं है।
doc_id

3
@joshuahedlund तब तक काम करता है जब तक आपके पास समय के साथ डेटा नहीं है t > 23:59:59 and t < 24:00:00। क्यों खराब से निपटने के लिए BETWEENबिल्कुल निर्दिष्ट ? इसके बजाय दाऊद की सलाह और इस्तेमाल करें WHERE dob >= '2011-01-01' AND dob < '2011-02-01':। सर्वश्रेष्ठ प्रदर्शन, और यह हर बार काम करता है।
मोहभंग हुआ

300

से MySQL-पुस्तिका :

यह अभिव्यक्ति के बराबर है (न्यूनतम <= expr और expr <= max)


3
इस उत्तर में लिंक किए गए मैनुअल से पता चलता है कि DATE और DATETIME ऑब्जेक्ट्स की तुलना करते समय एक कास्ट पसंद किया जाता है। इसलिए मुझे लगता है कि @tiagoinu के पास सख्त अर्थों में सबसे पूर्ण उत्तर है, लेकिन दोनों ही हाजिर हैं।
किंग्सओल्मन

@ जैमिंगर हो सकता है क्योंकि इसका जवाब कट्टरपंथी -पोस्टग्रेस लड़के से है: P
nawfal

27
संक्षेप में समावेशी है ... यही कारण है कि यह उत्तर चट्टानें हैं।
राफेल

6
पुरानी टिप्पणी, लेकिन मैं इसे विशिष्ट क्वेरी से जोड़ना चाहता था। "बेटविन" समावेशी है, लेकिन 00:00:00 तक बिना किसी निर्दिष्ट समय के तारीखें। इसलिए तिथि सीमा से तुलना करने से अंतिम दिन समाप्त हो जाएगा। या तो DATE (dob) को कॉल करें या दिन के अंत को निर्दिष्ट करें।
विंटरम्यूट9292

वे कहते हैं कि अभ्यास सोना है, मेरे उपयोग के मामले में यह बिल्कुल भी समावेशी नहीं है, मुझे आश्चर्य है कि मेरे साथ ऐसा क्यों होता है। मैंने कोशिश की और कभी-कभी यह काम करता है कभी-कभी नहीं। TIME डेटा फ़ील्ड पर इसका उपयोग करना।
जेफरी थाजिंटोकी

99

समस्या यह है कि 2011-01-31 वास्तव में 2011-01-31 00:00:00 है। वह दिन की शुरुआत है। दिन के दौरान सब कुछ शामिल नहीं है।


19
यह वास्तव में बताता है कि क्या चल रहा है और सवाल का जवाब देता है।
इवान पी

3
उन सभी वर्षों के बाद यह उत्तर अभी भी सबसे अच्छा है। बहुत बहुत धन्यवाद।
स्ट्रैबेक

31
select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'

1
मुझे लगता है कि यह ध्यान देने योग्य है कि, इसमें तारीखें शामिल नहीं होंगी, 2011-01-31 23:59:59लेकिन इसमें उन लोगों को भी शामिल किया जाएगा 2011-01-31 23:59:58 जो अंतिम दिन तक शामिल नहीं हैं, यह मामूली हो सकता है लेकिन किसी को इससे लाभ होगा।
doc_id

1
MySQL डॉक्यूमेंटेशन से rahmanisback मैं पुष्टि कर सकता हूं कि अंतिम दूसरी को शामिल किया जाएगा क्योंकि BETWEEN दोनों तरह से समावेशी है। dev.mysql.com/doc/refman/5.5/en/… का
फेल्पे

1
हाँ, @ ठीक है आप सही हैं। मैंने खुद को mysql डेटाबेस में चेक किया। इसमें 23:59:59परिणाम भी शामिल है । तो इसके दोनों तरीके समावेशी हैं।
लकी

2
यदि dobकॉलम उप-सेकंड परिशुद्धता के साथ टाइमस्टैम्प है, तो तब BETWEENभी दिन के अंतिम सेकंड के भीतर घटनाओं को याद नहीं करेंगे जब तक कि '2011-02-01 00:00:00' का उपयोग इसके बजाय नहीं किया जाता है?
नाइट्रोजन

1
-1। शामिल नहीं होंगे 2011-01-31 23:59:59.003। @nitrogen का उपयोग कर 2011-02-01 000:00:00जाएगा गलत तरीके से 1st फरवरी .... इसीलिए पर शून्य समय शामिल >=और <बजाय प्रयोग किया जाना चाहिए।
मोहभंग हुआ

6

क्या वह फ़ील्ड जिसे आप अपने क्वेरी प्रकार दिनांक प्रकार या दिनांक समय प्रकार में संदर्भित कर रहे हैं ?

आपके द्वारा वर्णित व्यवहार का एक सामान्य कारण यह है कि जब आप किसी DateTime प्रकार का उपयोग करते हैं, जहाँ आपको वास्तव में दिनांक प्रकार का उपयोग करना चाहिए। यही है, जब तक आपको वास्तव में यह जानने की आवश्यकता नहीं है कि किसी का जन्म किस समय हुआ था, बस दिनांक प्रकार का उपयोग करें।

आपके परिणामों में अंतिम दिन शामिल नहीं होने का कारण यह है कि क्वेरी उन तिथियों के समय भाग को मान रही है, जिन्हें आपने अपनी क्वेरी में निर्दिष्ट नहीं किया था।

यह है: आपकी क्वेरी की व्याख्या 2011-01-30 और 2011-01-31 के बीच की मध्यरात्रि तक की जा रही है, लेकिन डेटा का मान कुछ समय बाद 2011-01-31 के दिन हो सकता है।

सुझाव: यदि दिनांक डेटाइम प्रकार है तो फ़ील्ड को दिनांक प्रकार में बदलें।


4

हाय यह क्वेरी मेरे लिए काम करती है,

select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'

2
select * from person where DATE(dob) between '2011-01-01' and '2011-01-31'

आश्चर्यजनक रूप से ऐसे रूपांतरण MySQL में कई समस्याओं का समाधान हैं।


10
हैरानी की बात है, यह वही है जो स्वीकृत उत्तर (और कई अन्य) ने कहा ... 2 साल पहले आपने किया था।
क्रिस बेकर

0

ऊपरी तिथि को दिनांक + 1 दिन पर सेट करें, इसलिए आपके मामले में, इसे 2011-02-01 तक सेट करें।


1
यह गलत तरीके से 1 फरवरी को शून्य समय को शामिल करेगा .... जिसके कारण BETWEENइसे अनदेखा किया जाना चाहिए; लेकिन >=और <बजाय प्रयोग किया जाना चाहिए।
मोहभंग हुआ

0

आप क्वेरी को इस रूप में चला सकते हैं:

select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'

जैसे अन्य लोगों ने बताया, यदि आपकी तारीखें हार्डकोड हैं।

दूसरी ओर, यदि तारीख किसी अन्य तालिका में है, तो आप एक दिन जोड़ सकते हैं और एक सेकंड घटा सकते हैं (यदि तिथियां दूसरे / समय के बिना बचाई जाती हैं), जैसे:

select * from person JOIN some_table ... where dob between some_table.initial_date and (some_table.final_date + INTERVAL 1 DAY - INTERVAL 1 SECOND)

dobफेल्स पर कास्ट करने से बचें (जैसे कि स्वीकृत उत्तर में), क्योंकि इससे प्रदर्शन की बहुत बड़ी समस्याएं हो सकती हैं (जैसे कि dobक्षेत्र में एक इंडेक्स का उपयोग न कर पाना, यह मानना ​​कि एक है)। कार्य योजना लागू करके बदले जा सकते हैं using index conditionकरने के लिए using whereअगर आप की तरह कुछ बनाने DATE(dob)या CAST(dob AS DATE), इसलिए सावधान रहना!


0

मूल्यों के बीच MySql समावेशी है इसलिए जब आप '2011-01-01' और '2011-01-31' के बीच पाने की कोशिश करते हैं

यह 2011-01-31 2011-01-01 00:00:00तक 2011-01-31 00:00:00वास्तव में कुछ भी शामिल नहीं होगा क्योंकि इसके समय से जाना चाहिए2011-01-31 00:00:00 ~ 2011-01-31 23:59:59

ऊपरी सीमा के लिए आप इसे बदल सकते हैं, 2011-02-01तो यह सभी डेटा तक प्राप्त करेगा2011-01-31 23:59:59

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.