এসকিউএল: বিটউইইন বনাম <= এবং> =


111

এসকিউএল সার্ভার 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'

(সম্পাদনা করুন: দ্বিতীয় ইভেন্টডেটটি মূলত নিখোঁজ ছিল, সুতরাং কোয়েরিটি সিন্টেক্সিকভাবে ভুল ছিল)


1
এই সঙ্গে একটি আপাতদৃষ্টিতে সদৃশ stackoverflow.com/questions/1572840/sql-between-v1-and-v2
mjv

6
সত্যই নয়, ডেটটাইম হ্যান্ডলিংটি কিছুটা আলাদা, এবং এটি এসকিউএল সার্ভার ২০০৮-এর জন্য ছিল, এবং উত্তর পূর্ববর্তী সংস্করণগুলির জন্য উত্তরটি একই হবে এমন জিজ্ঞাসা না করে শাইজু নিশ্চিত হওয়ার কোনও উপায় নেই।
ইরফাই

উত্তর:


119

এগুলি অভিন্ন: BETWEENপ্রশ্নের দীর্ঘতর সিনট্যাক্সের জন্য একটি শর্টহ্যান্ড।

BETWEENযেমন বিকল্প কাজ করে না সেখানে বিকল্প দীর্ঘ সিনট্যাক্স ব্যবহার করুন

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

( দ্বিতীয় অবস্থার <চেয়ে নোট করুন <=।)


19
হতে পারে আপনার পয়েন্টটি জোর দেওয়া উচিত যে দ্বিতীয় শর্তটি '<'। পার্থক্যটি চিহ্নিত করতে আমার কিছুটা সময় লেগেছিল।
জেন্ডার

21
আমি যুক্ত করব যে আপনি তারিখের ডেটা ধরণের সাথে ডিল না করে বা অন্যথায় আপনার গতিরোধের সময়সীমার মানগুলির কোনও সময় উপাদান থাকবে না এমন গ্যারান্টি না দিলে আমি কখনই BETWEEN ব্যবহার করার পরামর্শ দিচ্ছি না recommend এটি সম্পর্কে সামঞ্জস্যপূর্ণ থাকার কারণে আপনি> = এবং <এর পরিবর্তে ভুল করে BETWEEN ব্যবহার করবেন এবং আপনি যে প্রশ্নের অর্থ বোঝাতে চাইছেন না সেখানে এমন কিছু ডেটা পাবেন বা ভাবেন যে আপনি কোনও অতিরিক্ত দিন পেয়ে যাচ্ছেন যখন আপনি না হন ডেটা ...
অ্যারন বারট্রান্ড

1
বিটউইয়ান শর্তে রূপান্তরিত হওয়ার সাথে সাথে কি দ্বিতীয় সংকলক পদক্ষেপ থাকবে? আমি বুঝতে পারি এটি কিছুটা পেডেন্টিক তবে সেখানে কি অতিরিক্ত ওভারহেড থাকবে?
জেমস স্কট

1
@ xmashallax কারণ তারা? তারা কেমন হয় না?
টনি অ্যান্ড্রুজ

2
অদ্ভুত ... আমি মনে করি আমি প্রশ্ন, উত্তর লেখা, মন্তব্য এবং আমার
কোডটিতে

37

তারা একই.

একটি বিষয় সাবধান হওয়া উচিত, আপনি যদি এটি কোনও তারিখের বিপরীতে ব্যবহার করেন তবে শেষের তারিখের ম্যাচটি দিনের শুরু হবে:

<= 20/10/2009

যেমনটি হয় না:

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

(এটির সাথে মিলবে <= 20/10/2009 00:00:00.000)


দিনটি ক্যাপচারের জন্য আপনি কেবল '2009-10-20' এবং '2009-10-21' এর মধ্যে ব্যবহার করতে পারেন
ডেভিড আন্দ্রে নেড

4
@ ডেভিডআন্দ্রেইনেড যে '2009-10-21 00: 00: 00.000' - এর সাথেও মিলবে - সম্ভবত আপনি যা চান তা সম্ভবত নয়।
হ্যানস কে st ইং

2
আপনি '2009-10-20 00:00:00' এবং '2009-10-20 23:59:59' বা ক্ষেত্র> = '2009-10-20 00:00:00' এবং ক্ষেত্রটি <= '2009-10-20 23:59:59' একেবারে নিশ্চিত হতে।
জেলকে

@ জিল্ট আপনার উদাহরণগুলি দিনের শেষ দ্বিতীয়ের মধ্যে ঘটে যাওয়া কোনও কিছু মিস করবে ... যেমন: পরের দিন 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 মূলশব্দটি সমস্ত আরডিবিএমএস প্ল্যাটফর্মে সমর্থিত নয়, তবে যদি এটি হয় তবে দুটি প্রশ্নের সাদৃশ্য হওয়া উচিত।

যেহেতু সেগুলি অভিন্ন, তাই গতির বা অন্য যে কোনও বিষয় হিসাবে সত্যই কোনও পার্থক্য নেই - এটি আপনার কাছে আরও প্রাকৃতিক বলে মনে হয় use


4

@ মার্কা_স, @ ক্লাউড, এবং অন্যান্য দ্বারা উল্লিখিত হিসাবে। তারা একটি বদ্ধ সীমার জন্য মূলত একই।

কিন্তু কোনো ভগ্ন সময় মান একটি বদ্ধ পরিসর বিষয় (বৃহত্তর-অর-সমান এবং হতে পারে কম-অর-সমান ) নামে দেড় খোলা পরিসর (বৃহত্তর-অর-সমান এবং উল্টোদিকে কম ) শেষ মান পর শেষ সম্ভাব্য তাত্ক্ষণিক।

সুতরাং এড়াতে যাতে ক্যোয়ারীটি আবার লিখতে হবে:

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

যেহেতু BETWEENঅর্ধ-খোলা ব্যবধানের জন্য কাজ করে না আমি সর্বদা এটি ব্যবহার করা কোনও তারিখ / সময় ক্যোয়ারীটিতে কঠোর নজর রাখি কারণ এটি সম্ভবত একটি ত্রুটি।


4

আমার কিছুটা অগ্রাধিকার আছে BETWEENকারণ এটি পাঠকের কাছে তাত্ক্ষণিকভাবে পরিষ্কার করে দেয় যে আপনি একটি পরিসরের জন্য একটি ক্ষেত্র পরীক্ষা করছেন । এটি বিশেষভাবে সত্য যদি আপনার টেবিলে একই রকম ক্ষেত্রের নাম থাকে।

যদি, বলুন, আমাদের টেবিলে একটি transactiondateএবং a উভয় রয়েছে 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

আমি মনে করি একমাত্র পার্থক্য হ'ল প্রতিটি ক্যোয়ারিতে সিনট্যাক্টিকাল চিনির পরিমাণ। বিটউইইন দ্বিতীয় কোয়েরির মতো হুবহু বলার এক চতুর উপায়।

কিছু আরডিবিএমএস সুনির্দিষ্ট পার্থক্য থাকতে পারে যা সম্পর্কে আমি অবগত নই, তবে আমি সত্যই তা মনে করি না।


2

যৌক্তিকভাবে এখানে কোনও পার্থক্য নেই। পারফরম্যান্স-ভিত্তিতে বেশিরভাগ ডিবিএমএস-এ-কৌশলগতভাবে রয়েছে - কোনও পার্থক্য নেই।


2

এই দেখুন চমৎকার ব্লগ পোস্টে থেকে হারুন বারট্রান্ড আপনি আপনার স্ট্রিং বিন্যাস কেন পরিবর্তন করা উচিত এবং কিভাবে সীমানা মান তারিখের ব্যাপ্তি ক্যোয়ারিগুলিতে পরিচালনা করা হয় সম্পর্কে।



1

দাবি অস্বীকার: নীচের সমস্ত কিছু কেবলমাত্র বিবর্ণ এবং সরাসরি আমার ব্যক্তিগত অভিজ্ঞতা থেকে আঁকা। যে কেউ যদি আরও পরাক্রান্তভাবে কঠোর বিশ্লেষণ পরিচালনা করতে অনুভব করে তবে আমি যদি তা হয় তবে এটিকে ভোটের বাইরে নিয়ে যাওয়া এবং গ্রহণের জন্য স্বাগত। আমি আরও সচেতন যে এসকিউএল একটি ঘোষণামূলক ভাষা এবং আপনি যখন লিখবেন তখন আপনার কোডটি কীভাবে প্রসেস হয় তা বিবেচনা করার কথা নয়, তবে, আমি আমার সময়কে মূল্যবান বলে মনে করি।

এখানে অসীম যৌক্তিক সমতুল্য বক্তব্য রয়েছে, তবে আমি তিনটি বিবেচনা করব (ইশ)।

কেস 1: একটি মান ক্রমে দুটি তুলনা (মূল্যায়ন আদেশ স্থির)

এ> = মিনিবাউন্ড এবং এ <= ম্যাক্সবাউন্ড

কেস ২: সিনট্যাকটিক চিনি (মূল্যায়ন আদেশটি লেখক চয়ন করেন না)

একটি বিটুইন মিনবাউন্ড এবং ম্যাক্সবাউন্ড

কেস 3: একটি শিক্ষিত আদেশে দুটি তুলনা (লেখার সময় মূল্যায়ন আদেশ নির্বাচিত)

এ> = মিনিবাউন্ড এবং এ <= ম্যাক্সবাউন্ড

অথবা

এ <= ম্যাক্সবাউন্ড এবং এ> = মিনিবাউন্ড

আমার অভিজ্ঞতায় কেস 1 এবং কেস 2 এর পারফরম্যান্সে কোনও সামঞ্জস্যপূর্ণ বা উল্লেখযোগ্য পার্থক্য নেই কারণ তারা ডেটাসেট অজ্ঞ।

যাইহোক, কেস 3 কার্যকরভাবে কার্যকর করার সময়গুলিকে উন্নত করতে পারে। বিশেষ করে, যদি আপনি একটি বড় ডেটা সেট সঙ্গেও কাজ করছি, ঘটতে কিছু অনুসন্ধানমূলক জ্ঞান আছে কিনা সম্পর্কে একটি সম্ভাবনা বেশি হয় তার চেয়ে অনেক বেশী হতে MaxBound বা চেয়ে ক্ষুদ্রতর MinBound আপনি 3 ব্যবহার করে এবং তুলনা ক্রম দ্বারা মৃত্যুদন্ড বার লক্ষণীয়ভাবে উন্নত করতে পারেন সেই অনুযায়ী।

আমার কাছে থাকা একটি ব্যবহারের ক্ষেত্রে একটি নির্দিষ্ট ব্যবধানের মধ্যে রেকর্ডগুলির জন্য অ-সূচিযুক্ত তারিখগুলি সহ একটি বৃহত historicalতিহাসিক ডেটাসেটটি অনুসন্ধান করা হচ্ছে। কোয়েরিটি লেখার সময়, নির্দিষ্ট ব্যবধানের আগে বা নির্দিষ্ট ব্যবধানের পরে আরও ডেটা উপস্থিত রয়েছে কি না সে সম্পর্কে আমার ভাল ধারণা থাকবে এবং সেই অনুযায়ী আমার তুলনাগুলি অর্ডার করতে পারেন। আমি ডেটাসেটের আকার, ক্যোয়ারির জটিলতা এবং প্রথম তুলনা করে ফিল্টার করা রেকর্ডের পরিমাণের উপর নির্ভর করে মৃত্যুদন্ড কার্যকর করার সময়টিকে অর্ধেক করে কেটেছি।


উম, কি? কেস 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>

লেনদেন-এসকিউএল এই বৈশিষ্ট্যটি সমর্থন করে না।

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তবে তুলনা মানগুলি বাছাই করার পরে।

ডিবি <> ফিডাল ডেমো

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