এমএস এসকিউএল সার্ভারের "এর মধ্যে" কি সীমার সীমানা অন্তর্ভুক্ত করে?


234

উদাহরণস্বরূপ পারেন

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

5 এবং 10 নির্বাচন করুন বা এগুলি সীমা থেকে বাদ দেওয়া হয়েছে?

উত্তর:


258

বিটউইউইন অপারেটর অন্তর্ভুক্ত।

অনলাইন বই থেকে:

পরীক্ষা-এক্সপ্রেসনের মান সূচনা_প্রকাশের মানের চেয়ে বড় বা সমান এবং শেষ_এক্সপ্রেসের মানের চেয়ে কম বা সমান হলে বিটওয়েন সত্য দেয় TR

ডেটটাইম ক্যাভেট

নোট: ডেটটাইমসের সাথে আপনাকে সতর্ক থাকতে হবে; যদি কেবল একটি তারিখ দেওয়া হয় তবে সেই দিন মধ্যরাত হিসাবে মান নেওয়া হয়; আপনার শেষ তারিখের মধ্যে অনুপস্থিত সময়গুলি এড়াতে বা একাধিক রেঞ্জের মধ্যরাতে নিম্নলিখিত দিনের ডেটা ক্যাপচার পুনরাবৃত্তি করতে, আপনার শেষ তারিখটি আপনার তারিখের পরের দিন মধ্যরাতের আগে 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
দু'টি তারিখের মধ্যে ডেটটাইমগুলি ফিল্টার করতে বেটউইইন ব্যবহার করার সময়, আপনি একটি তারিখে ডেটটাইমও কাস্ট করতে পারেন, উদাহরণস্বরূপ: যেখানে '2017-09-01' এবং '2017-09-01' অবধি কনভার্ট করুন (2017-09-01) এই পদ্ধতির সময়টি হয়ে যায় ডেটটাইম অপ্রাসঙ্গিক এর উপাদান
পিট

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'

সত্যই 12 টা হিসাবে ব্যাখ্যা করা হয়, বা

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 সারি বাদ দেয় lude
মার্টিন স্মিথ

8
এই বিষয়টি অবশ্যই সঠিক; তবে আপনি তারিখের সময় নিয়ে কাজ করলে অবাক হওয়ার কিছু নেই। এটি BETWEEN 5 AND 10অন্তর্ভুক্ত করার জন্য সাদৃশ্যপূর্ণ 10.2... এতে অন্তর্ভুক্ত নেই ...
আন্দ্রেজেজ ডয়েল

4
CASTing datetimeহিসেবে DATEকাজ করবে: CAST(DATE_TIME_COL AS DATE) BETWEEN '01/01/2009' AND '01/31/2009'
ক্রেগ

2
@ ক্রেইগ, এটি সত্য, যতক্ষণ আপনি এসকিউএল ২০০৮ বা তার বেশি ব্যবহার করছেন, যা ডেট ডাটাটাইপ চালু হওয়ার সময়। এছাড়াও, সেই বাক্য গঠনটি প্রতিটি একক সারির জন্য সেই মানটিকে রূপান্তরিত করে, সুতরাং সেই ক্ষেত্রে কোনও সূচক ব্যবহার করতে সক্ষম হবে না (যদি এটি উদ্বেগের বিষয় হয়) is
ব্র্যাডিসি

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

এসকিউএল সার্ভার ২০০৮ থেকে আসল বিশ্বের উদাহরণ।

উৎস তথ্য:

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

আপনি যদি এটি হিট করেন, এবং কোডটিতে কোনও দিন যুক্ত করার চেষ্টা করতে এবং পরিচালনা করতে চান না, তবে ডিবি এটি করতে দিন ..

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

যদি আপনি সময়ের অংশটি অন্তর্ভুক্ত করেন: নিশ্চিত করুন এটি মধ্যরাতের উল্লেখ করেছে। অন্যথায় আপনি কেবল সময় বাদ দিতে পারেন:

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

এবং এটি সম্পর্কে চিন্তা করবেন না।


12

যাদের মধ্যে হয়েছে (লেনদেন-এসকিউএল)

পরীক্ষার জন্য একটি ( এন ) ( সমেত ) ব্যাপ্তি নির্দিষ্ট করে।

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

যুক্তি

test_expression

প্রারম্ভিক_প্রকাশ এবং শেষ_প্রেমী দ্বারা সংজ্ঞায়িত ব্যাপ্তির জন্য পরীক্ষা করা এক্সপ্রেশন। টেস্ট_এক্সপ্রেশনটি অবশ্যই প্রারম্ভ_এক্সপ্রেশন এবং শেষ_এক্সপ্রেশন উভয়ের মতোই ডেটা টাইপ হতে হবে।

NOT

সুনির্দিষ্ট করে যে ভবিষ্যদ্বাণীকারীটির ফলাফলটি উপেক্ষিত হবে।

begin_expression

কোন বৈধ এক্সপ্রেশন। start_expression অবশ্যই টেস্ট_এক্সপ্রেশন এবং end_expression উভয়ের মতোই ডেটা টাইপ হওয়া উচিত।

end_expression

কোন বৈধ এক্সপ্রেশন। end_expression অবশ্যই টেস্ট_এক্সপ্রেশন এবং আর্টিং এক্সপ্রেশন উভয়ের মতোই ডেটা টাইপ হওয়া উচিত।

AND

প্লেসহোল্ডার হিসাবে কাজ করে যা টেস্ট_এক্সপ্রেশন নির্দেশ করে শুরু_প্রেম এবং শেষ_আমাকর্ষণ দ্বারা নির্দেশিত সীমার মধ্যে হওয়া উচিত।

মন্তব্য

একচেটিয়া পরিসীমা নির্দিষ্ট করতে, (>) এর চেয়ে বেশি এবং অপারেটর (<) এর চেয়ে কম ব্যবহার করুন। যদি ভবিষ্যতে বিকেলে বা ভবিষ্যদ্বাণী অনুসারে কোনও ইনপুট যদি নাল হয় তবে ফলাফলটি অজানা।

ফলাফলের মান

পরীক্ষা-এক্সপ্রেসনের মান সূচনা_প্রকাশের মানের চেয়ে বড় বা সমান এবং শেষ_এক্সপ্রেসের মানের চেয়ে কম বা সমান হলে বিটওয়েন সত্য দেয় TR

টেস্ট_এক্সপ্রেসনের মান সূচনা_প্রকাশের মানের চেয়ে কম বা শেষ_একটি চাপের মানের চেয়ে বেশি হলে সত্য নয় B


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)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.