SQL: BETWEEN बनाम <= और> =


111

SQL Server 2000 और 2005 में:

  • इन दोनों WHEREखण्डों में क्या अंतर है ?
  • मुझे किन परिदृश्यों पर उपयोग करना चाहिए?

क्वेरी 1:

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'

क्वेरी 2:

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
  AND EventDate <='10/18/2009'

(संपादित करें: दूसरा Eventdate मूल रूप से गायब था, इसलिए क्वेरी वाक्यात्मक रूप से गलत थी)



6
वास्तव में नहीं, डेटाइम का हैंडलिंग थोड़ा अलग है, प्लस जो SQL सर्वर 2008 के लिए था, और कोई रास्ता नहीं है कि श्यजू बिना यह पूछे कि निश्चित हो सकता है कि उत्तर पिछले संस्करणों के लिए समान होगा।
इरफी

जवाबों:


119

वे समान हैं: BETWEENप्रश्न में लंबे समय तक वाक्य रचना के लिए एक शॉर्टहैंड है।

वैकल्पिक वैकल्पिक सिंटैक्स का उपयोग करें, जहां BETWEENकाम नहीं करता है

Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/18/2009'

( दूसरी स्थिति के <बजाय ध्यान दें <=।)


19
शायद आपको इस बात पर जोर देना चाहिए कि दूसरी शर्त '<' है। मुझे अंतर को समझने में कुछ समय लगा।
जिंदर

21
जब तक आप डेट डेटा प्रकार के साथ काम नहीं कर रहे हैं या अन्यथा गारंटी दी है कि आपके डेटाटाइम मानों में कभी भी समय घटक नहीं होगा, मैं इसे दृढ़ता से उपयोग करने की सलाह देता हूं। इसके बारे में सुसंगत होने से यह संभावना कम हो जाएगी कि आप> और = के बजाय गलती से BETWEEN का उपयोग करेंगे, और या तो उस क्वेरी में कुछ डेटा प्राप्त करें जिसका आप मतलब नहीं था, या यह सोचें कि आपको एक अतिरिक्त दिन मिल रहा था डेटा जब आप नहीं कर रहे हैं ...
हारून बर्ट्रेंड

1
क्या कोई दूसरा संकलक कदम होगा क्योंकि BETWEEN सशर्त में परिवर्तित हो जाता है? मैं समझता हूं कि यह थोड़ा कठिन है लेकिन क्या कोई अतिरिक्त ओवरहेड होगा?
जेम्स स्कॉट

1
@xmashallax क्योंकि वे हैं? वे कैसे नहीं हैं?
टोनी एंड्रयूज

2
अजीब ... मुझे लगता है कि मैं इस सवाल, जवाब के लेखन, टिप्पणियों और इस तथ्य से भ्रमित हो गया हूं कि मेरे कोड में स्पष्ट रूप से एक बग है =)
xmashallax

37

वह एक जैसे है।

इससे सावधान रहने वाली एक बात यह है कि यदि आप इसका उपयोग DATETIME के ​​खिलाफ कर रहे हैं, तो अंतिम तिथि के लिए मैच दिन की शुरुआत होगी:

<= 20/10/2009

के रूप में ही नहीं है:

<= 20/10/2009 23:59:59

(इसके खिलाफ मैच होगा<= 20/10/2009 00:00:00.000 )


आप उस दिन को पकड़ने के लिए '2009-10-20' और '2009-10-21' के बीच इस्तेमाल कर सकते हैं
डेविड आंद्रेई नेड

4
@DavidAndreiNed जो '2009-10-21 00: 00: 00.000' से भी मेल खाएगा - शायद वह नहीं जो आप चाहते हैं।
हंस के Hans

2
आप फ़ील्ड '2009-10-20-20 00:00:00' और '2009-10-20 23:59:59' या फ़ील्ड> = '2009-10-20 00:00:00' और फ़ील्ड <= चाहेंगे '2009-10-20 23:59:59' बिल्कुल निश्चित होना।
जाइल्ट

@geilt आपके उदाहरण दिन के आखिरी सेकंड के भीतर हुए कुछ भी याद करेंगे ... यानी: अगले दिन 23:59:59 और 00:00:00 के बीच।
सेठ फूल

00:00:00 अगले दिन की शुरुआत है और मैं क्यों = = और <= और नहीं> या <का उपयोग करता हूं। लेकिन अगर आपका मतलब माइक्रोसेकंड है और आप उन्हें स्टोर करते हैं तो आप अंतिम और अंतिम माइक्रोसेकंड भी डालना चाहेंगे।
भूगोल

14

यद्यपि BETWEENयह पढ़ना और बनाए रखना आसान है, मैं शायद ही कभी इसके उपयोग की सलाह देता हूं क्योंकि यह एक बंद अंतराल है और जैसा कि पहले उल्लेख किया गया है कि यह तारीखों के साथ एक समस्या हो सकती है - समय घटकों के बिना भी।

उदाहरण के लिए, जब मासिक डेटा के साथ काम करना अक्सर तारीखों की तुलना करना आम होता है BETWEEN first AND last, लेकिन व्यवहार में यह आमतौर पर लिखना आसान होता है dt >= first AND dt < next-first(जो समय भाग के मुद्दे को भी हल करता है) - चूंकि निर्धारण lastआमतौर पर निर्धारित करने से एक कदम लंबा होता है next-first(एक दिन घटाकर) ।

इसके अलावा, एक और गोचा यह है कि निचले और ऊपरी सीमा को सही क्रम (यानी BETWEEN low AND high) में निर्दिष्ट करने की आवश्यकता होती है ।


4

आमतौर पर, कोई अंतर नहीं है - BETWEENसभी RDBMS प्लेटफार्मों पर कीवर्ड का समर्थन नहीं किया जाता है, लेकिन यदि ऐसा है, तो दोनों क्वेरी समान होनी चाहिए।

चूंकि वे समान हैं, गति या किसी अन्य चीज़ के मामले में वास्तव में कोई अंतर नहीं है - जो आपके लिए अधिक स्वाभाविक लगता है उसका उपयोग करें।


4

जैसा कि @marc_s, @Cloud, et al द्वारा उल्लेख किया गया है। वे मूल रूप से एक बंद सीमा के लिए समान हैं।

लेकिन किसी भी आंशिक समय के मानों को बंद रेंज (अधिक-या-बराबर और कम-या-बराबर ) के साथ समस्या हो सकती है, क्योंकि आधी-खुली सीमा (अधिक-या-बराबर और कम-से-कम ) के विपरीत अंतिम मूल्य के साथ अंतिम संभव तत्काल।

ताकि बचने के लिए क्वेरी को फिर से लिखा जाना चाहिए:

SELECT EventId, EventName
  FROM EventMaster
 WHERE (EventDate >= '2009-10-15' AND
        EventDate <  '2009-10-19')    /* <<<== 19th, not 18th */

चूंकि BETWEENमैं आधे-खुले अंतराल के लिए काम नहीं करता हूं, मैं हमेशा किसी भी तारीख / समय क्वेरी का उपयोग करता हूं, जो शायद इसकी त्रुटि है।


4

मेरी थोड़ी सी प्राथमिकता है BETWEENक्योंकि यह पाठक को तुरंत स्पष्ट कर देता है कि आप एक क्षेत्र के लिए एक क्षेत्र की जाँच कर रहे हैं । यह विशेष रूप से सच है यदि आपके टेबल में समान फ़ील्ड नाम हैं।

अगर, कहते हैं, हमारी तालिका में ए transactiondateऔर ए है transitiondate, अगर मैं पढ़ता हूं

transactiondate between ...

मुझे तुरंत पता है कि परीक्षण के दोनों छोर इस एक क्षेत्र के खिलाफ हैं।

अगर मैं पढ़ता हूँ

transactiondate>='2009-04-17' and transactiondate<='2009-04-22'

मुझे यह सुनिश्चित करने के लिए एक अतिरिक्त क्षण लेना होगा कि दोनों क्षेत्र समान हैं।

इसके अलावा, जैसा कि एक क्वेरी समय के साथ संपादित हो जाती है, एक मैला प्रोग्रामर दो क्षेत्रों को अलग कर सकता है। मैंने बहुत सारे प्रश्न देखे हैं जो कुछ कहते हैं

where transactiondate>='2009-04-17'
  and salestype='A'
  and customernumber=customer.idnumber
  and transactiondate<='2009-04-22'

यदि वे इसके साथ प्रयास करते हैं BETWEEN, तो निश्चित रूप से, यह एक वाक्यविन्यास त्रुटि होगी और तुरंत तय हो जाएगी।


3

मुझे लगता है कि केवल अंतर प्रत्येक क्वेरी पर वाक्य रचना चीनी की मात्रा है। BETWEEN दूसरी क्वेरी के समान ही कहने का एक आसान तरीका है।

कुछ RDBMS विशिष्ट अंतर हो सकते हैं जिनके बारे में मुझे जानकारी नहीं है, लेकिन मुझे वास्तव में ऐसा नहीं लगता।


2

तार्किक रूप से इसमें कोई अंतर नहीं है। प्रदर्शन-वार वहाँ ज्यादातर DBMSes पर-बिल्कुल, कोई अंतर नहीं है।


2

हारून बर्ट्रेंड के इस उत्कृष्ट ब्लॉग पोस्ट को देखें कि आपको अपने स्ट्रिंग प्रारूप को क्यों बदलना चाहिए और सीमा संबंधी प्रश्नों को तिथि प्रश्नों में कैसे संभाला जाना चाहिए।



1

डिस्क्लेमर: नीचे दी गई हर चीज केवल व्यक्तिगत है और मेरे व्यक्तिगत अनुभव से सीधे खींची गई है। जो भी अधिक अनुभवजन्य कठोर विश्लेषण करने के लिए महसूस करता है, उसका स्वागत है और अगर मैं नीचे हूं तो वोट देने के लिए आपका स्वागत है। मुझे यह भी पता है कि एसक्यूएल एक घोषणात्मक भाषा है और आपको यह विचार नहीं करना चाहिए कि जब आप इसे लिखते हैं, तो आपका कोड कैसे संसाधित होता है, लेकिन, क्योंकि मैं अपने समय को महत्व देता हूं, मैं करता हूं।

अनंत तार्किक रूप से समतुल्य कथन हैं, लेकिन मैं तीन (ईश) पर विचार करूंगा।

केस 1: एक मानक क्रम में दो तुलनाएँ (मूल्यांकन क्रम निर्धारित)

ए> = मिनबाउंड और ए <= मैक्सबाउंड

केस 2: सिंथेटिक चीनी (मूल्यांकन आदेश लेखक द्वारा नहीं चुना गया है)

एक बेटविन मिनबाउंड और मैक्सबाउंड

केस 3: एक शिक्षित क्रम में दो तुलनाएं (लेखन समय में चुना गया मूल्यांकन क्रम)

ए> = मिनबाउंड और ए <= मैक्सबाउंड

या

ए <= मैक्सबाउंड और ए> = मिनबाउंड

मेरे अनुभव में, केस 1 और केस 2 के प्रदर्शन में कोई सुसंगत या उल्लेखनीय अंतर नहीं है क्योंकि वे डेटासेट अज्ञानी हैं।

हालाँकि, केस 3 निष्पादन समय में बहुत सुधार कर सकता है। विशेष रूप से, अगर आप एक बड़े डेटा सेट के साथ काम कर रहे हैं और ऐसा कुछ अनुमानी ज्ञान है के लिए कि क्या बारे में एक अधिक होने की संभावना है से अधिक होना MaxBound या की तुलना में कम MinBound आप प्रकरण 3 का उपयोग और तुलना आदेश देने से निष्पादन समय काफ़ी सुधार कर सकते हैं तदनुसार।

मेरे पास एक उपयोग मामला एक विशिष्ट अंतराल के भीतर रिकॉर्ड के लिए गैर-अनुक्रमित तारीखों के साथ एक बड़े ऐतिहासिक डेटासेट को क्वेरी कर रहा है। क्वेरी लिखते समय, मुझे इस बात का अच्छा अंदाजा होगा कि निर्दिष्ट अंतराल से अधिक डेटा मौजूद है या नहीं और निर्दिष्ट अंतराल के बाद ही मेरी तुलना कर सकते हैं। मैंने डेटासेट के आकार, क्वेरी की जटिलता, और पहली तुलना द्वारा रिकॉर्ड किए गए रिकॉर्ड की मात्रा के आधार पर निष्पादन समय में आधे से अधिक कटौती की है।


उम्म क्या? केस 3 केस 1 और केस 2 के समान तर्क को साझा नहीं करता है। यदि आप यह देखना चाहते हैं कि Aदोनों सीमा से अधिक है या नहीं, तो यह जांचें कि क्या Aयह बड़ा है MaxBound। आपकी पोस्ट को कुछ समायोजन की आवश्यकता है।
मिकमैकुसा

लगता है कि मैंने समानता ऑपरेटरों पर एक टाइपो बनाया। अच्छी पकड़।
लंचपैड

0

इस परिदृश्य में col BETWEEN ... AND ...और col <= ... and col >= ...समतुल्य हैं।


एसक्यूएल मानक भी T461 सममितीय बीटा की व्याख्या करता है :

 <between predicate part 2> ::=
 [ NOT ] BETWEEN [ ASYMMETRIC | SYMMETRIC ]
 <row value predicand> AND <row value predicand>

Transact-SQL इस सुविधा का समर्थन नहीं करता है।

BETWEENमानों को क्रमबद्ध किया जाता है। उदाहरण के लिए:

SELECT 1 WHERE 3 BETWEEN 10 AND 1
-- no rows

<=>

SELECT 1 WHERE 3 >= 10 AND 3 <= 1
-- no rows

दूसरी ओर:

SELECT 1 WHERE 3 BETWEEN SYMMETRIC 1 AND 10;
-- 1

SELECT 1 WHERE 3 BETWEEN SYMMETRIC 10 AND 1
-- 1

यह बिल्कुल सामान्य की तरह काम करता है BETWEENलेकिन तुलनात्मक मूल्यों को छाँटने के बाद।

db <> फिडेल डेमो

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