क्या MS SQL सर्वर के "बीच" में सीमाएं शामिल हैं?


234

उदाहरण के लिए कर सकते हैं

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

5 और 10 का चयन करें या उन्हें सीमा से बाहर रखा गया है?

जवाबों:


258

BETWEEN ऑपरेटर समावेशी है।

ऑनलाइन पुस्तकों से:

BETWEEN TRUE लौटाता है यदि test_expression का मूल्य start_expression के मान से अधिक या बराबर है और end_expression के मान से कम या उसके बराबर है।

डेटटाइम कैविट

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

जून 2016 के भीतर सभी मान प्राप्त करने के लिए आपको दौड़ने की आवश्यकता होगी:

where myDateTime between '20160601' and DATEADD(millisecond, -3, '20160701')

अर्थात

where myDateTime between '20160601 00:00:00.000' and '20160630 23:59:59.997'

डेटाटाइम 2 और डेटाटाइमऑफ़सेट

एक तारीख से 3 एमएस को घटाकर आप 3 एमएस विंडो से लापता पंक्तियों के लिए असुरक्षित छोड़ देंगे। सही समाधान भी सबसे सरल है:

where myDateTime >= '20160601' AND myDateTime < '20160701'

11
दो तिथियों के बीच DateTimes को फ़िल्टर करने के लिए BETWEEN का उपयोग करते समय, आप DateTime को दिनांक के लिए भी डाल सकते हैं, जैसे: जहां CONVERT (DATE, MyDate) BETWEEN '2017-09-01' और '2017-09-30' यह दृष्टिकोण समय बनाता है डेटाइम अप्रासंगिक का तत्व
पीट

1
सुनिश्चित करें कि दिनांक से 3 एमएस को घटाने की कोशिश न करें; आप उन 3 एमएस से आइटम याद करेंगे। और तुम भी नहीं करना चाहते CONVERTएक datetime एक करने के लिए तिथि , कि के रूप में बेकार अनुक्रमित प्रस्तुत करना होगा। मानक का उपयोग करें WHERE OrderDate >= '20160601' AND OrderDate < '20160701'। इसके अलावा, उपयोग करना सुनिश्चित करें yyyymmdd, जैसा yyyy-mm-ddकि स्थानीय निर्भर है, और आपके सर्वर की mdy, dmy, ymd, ydm, myd, and dymसेटिंग के आधार पर गलत व्याख्या की जाएगी ।
इयान बॉयड

254

हां, लेकिन तारीखों के लिए उपयोग करते समय सावधान रहें।

BETWEEN '20090101' AND '20090131'

वास्तव में 12am के रूप में व्याख्या की जाती है, या

BETWEEN '20090101 00:00:00' AND '20090131 00:00:00'

इसलिए 31 जनवरी के दिन के दौरान कुछ भी याद होगा। इस स्थिति में, आपको उपयोग करना होगा:

myDate >= '20090101 00:00:00' AND myDate < '20090201 00:00:00'  --CORRECT!

या

BETWEEN '20090101 00:00:00' AND '20090131 23:59:59' --WRONG! (see update!)

अद्यतन : यह पूरी तरह से संभव है कि दिन के अंतिम सेकंड के भीतर रिकॉर्ड बनाया जाए, साथ ही साथ डेटटाइम भी देर से 20090101 23:59:59.997!!

इस कारण से, BETWEEN (firstday) AND (lastday 23:59:59)दृष्टिकोण की सिफारिश नहीं की जाती है।

myDate >= (firstday) AND myDate < (Lastday+1)इसके बजाय दृष्टिकोण का उपयोग करें ।

इस मुद्दे पर यहाँ अच्छा लेख


1
स्ट्रिंग के साथ भी इसी तरह के मुद्दे WHERE col BETWEEN 'a' AND 'z'उदाहरण के लिए अधिकांश z पंक्तियों को बाहर कर देंगे।
मार्टिन स्मिथ

8
यह बिंदु निश्चित रूप से सही है; लेकिन अगर आप datetimes के साथ काम कर रहे हैं तो आश्चर्य नहीं होना चाहिए। यह इंगित करने के लिए अनुरूप है कि BETWEEN 5 AND 10इसमें शामिल नहीं है 10.2...
Andrzej Doyle

4
CASTकाम के datetimeरूप में आईएनजी :। DATECAST(DATE_TIME_COL AS DATE) BETWEEN '01/01/2009' AND '01/31/2009'
क्रेग

2
@ क्रेग, यह सच है, जब तक आप SQL 2008 या उच्चतर का उपयोग कर रहे हैं, जो कि जब डेट डेटाइप पेश किया गया था। इसके अलावा, वह वाक्य-विन्यास उस मूल्य को हर एक पंक्ति के लिए रूपांतरित कर देगा, इसलिए उस क्षेत्र पर किसी भी अनुक्रमणिका का उपयोग करने में सक्षम नहीं होगा (यदि यह एक चिंता का विषय है)।
ब्रैडेक

It is entirely possible to have records created within that last second of the day, with a datetime as late as 01/01/2009 23:59:59.997<- सके तुम सिर्फ तब का उपयोग AND '01/31/2009 23:59:59.99999999'या हालांकि कई 9 के लिए आवश्यक हैं
वाल

16

SQL सर्वर 2008 से वास्तविक दुनिया उदाहरण।

स्रोत डेटा:

ID    Start
1     2010-04-30 00:00:01.000
2     2010-04-02 00:00:00.000
3     2010-05-01 00:00:00.000
4     2010-07-31 00:00:00.000

प्रश्न:

SELECT
    *
FROM
    tbl
WHERE
    Start BETWEEN '2010-04-01 00:00:00' AND '2010-05-01 00:00:00'

परिणाम:

ID    Start
1     2010-04-30 00:00:01.000
2     2010-04-02 00:00:00.000

वैकल्पिक शब्द


मुझे आपका जवाब नहीं मिला, ईमानदार होने के लिए। यदि आपने एक पोस्ट किया है तो शायद मेरे इंटरनेट प्रदाता ने आपका स्क्रीनशॉट छिपा दिया है।
अनार खलीलोव

2
पंक्ति को ID = 3बाहर क्यों रखा गया है? इसका Startमान BETWEENऊपरी-बाउंड मान के बराबर है , और BETWEENएक समावेशी श्रेणी है, न कि एक विशेष ऊपरी-बाउंडेड श्रेणी।
दाई

परिणामों के साथ बेहतर जवाब।
सैम

13

यदि आप इसे मारते हैं, और वास्तव में कोशिश नहीं करना चाहते हैं और कोड में एक दिन जोड़ना चाहते हैं, तो DB को इसे करने दें।

myDate >= '20090101 00:00:00' AND myDate < DATEADD(day,1,'20090101 00:00:00')

यदि आप समय भाग को शामिल करते हैं: सुनिश्चित करें कि यह मध्यरात्रि को संदर्भित करता है। अन्यथा आप समय को छोड़ सकते हैं:

myDate >= '20090101' AND myDate < DATEADD(day,1,'20090101')

और इसके बारे में चिंता मत करो।


12

बेटविन (लेनदेन-एसक्यूएल)

निर्दिष्ट करने के लिए एक ( n ) ( समावेशी ) श्रेणी निर्दिष्ट करता है ।

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

तर्क

test_expression

क्या start_expression और end_expression द्वारा परिभाषित सीमा में परीक्षण करने के लिए अभिव्यक्ति है। test_expression एक ही डेटा प्रकार होना चाहिए, जैसे दोनों start_expression और end_expression।

NOT

निर्दिष्ट करता है कि विधेय के परिणाम को नकारा जाना चाहिए।

begin_expression

कोई मान्य अभिव्यक्ति है। start_expression एक ही डेटा प्रकार होना चाहिए जैसे कि test_expression और end_expression दोनों।

end_expression

कोई मान्य अभिव्यक्ति है। end_expression एक ही डेटा प्रकार होना चाहिए जैसे कि test_expression और Begin_expression दोनों।

AND

एक प्लेसहोल्डर के रूप में कार्य करता है जो इंगित करता है कि test_expression start_expression और end_expression द्वारा इंगित सीमा के भीतर होना चाहिए।

टिप्पणियों

किसी विशेष श्रेणी को निर्दिष्ट करने के लिए, (>) से अधिक और ऑपरेटरों से कम (<) का उपयोग करें। यदि किसी इनपुट को BETWEEN या NOT BETWEEN predicate NULL है, तो परिणाम UNKNOWN है।

परिणाम मान

BETWEEN TRUE लौटाता है यदि test_expression का मूल्य start_expression के मान से अधिक या बराबर है और end_expression के मान से कम या उसके बराबर है।

यदि सही नहीं है तो TRUE वापस नहीं आता है यदि test_expression का मूल्य start_expression के मान से कम या end_expression के मान से अधिक है।


3

यदि स्तंभ डेटा प्रकार डेटाइम है, तो आप डेटटाइम से समय समाप्त करने और दिनांक सीमा के बीच तुलना करने के लिए ऐसा कर सकते हैं।

where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date)

यह अंतिम तिथि में +1 जोड़ने से बेहतर काम करता है। मैं एंड्रयू मोर्टन से सहमत हूं - अगर यह बहुत ही सारगर्भित नहीं है, तो यह कॉलम डेटा प्रकार को बदलने के लिए प्रदर्शन में सुधार कर सकता है या केवल पहले से गणना की गई तारीखों के साथ दूसरा कॉलम जोड़ सकता है।
अर्नो पीटर्स

0

इसमें सीमाएँ शामिल हैं।

declare @startDate date = cast('15-NOV-2016' as date) 
declare @endDate date = cast('30-NOV-2016' as date)
create table #test (c1 date)
insert into #test values(cast('15-NOV-2016' as date))
insert into #test values(cast('20-NOV-2016' as date))
insert into #test values(cast('30-NOV-2016' as date))
select * from #test where c1 between @startDate and @endDate
drop table #test
RESULT    c1
2016-11-15
2016-11-20
2016-11-30


declare @r1 int  = 10
declare @r2 int  = 15
create table #test1 (c1 int)
insert into #test1 values(10)
insert into #test1 values(15)
insert into #test1 values(11)
select * from #test1 where c1 between @r1 and @r2
drop table #test1
RESULT c1
10
11
15

-3

मैंने हमेशा इसका उपयोग किया है:

कहाँ मेरा बेटा शुरू हो रहा है और अंत (1 +)

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