سؤال

في 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'

(يحرر:كان تاريخ الحدث الثاني مفقودًا في الأصل، لذا كان الاستعلام خاطئًا من الناحية النحوية)

هل كانت مفيدة؟

المحلول

إنهم متطابقون: BETWEEN هو اختصار لبناء الجملة الأطول في السؤال.

استخدم بناء جملة بديل أطول حيث BETWEEN لا يعمل على سبيل المثال.

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

(ملحوظة < بدلا من <= في الحالة الثانية .)

نصائح أخرى

إنهم متشابهون.

هناك شيء واحد يجب توخي الحذر منه، وهو أنه إذا كنت تستخدم هذا مقابل DATETIME، فإن مطابقة تاريخ الانتهاء ستكون بداية اليوم:

<= 20/10/2009

ليس هو نفسه كما يلي:

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

(هو - هي كان مباراة ضد <= 20/10/2009 00:00:00.000)

بالرغم من BETWEEN من السهل قراءته وصيانته، ونادرًا ما أوصي باستخدامه لأنه فترة زمنية مغلقة وكما ذكرنا سابقًا يمكن أن يكون هذا مشكلة مع التواريخ - حتى بدون مكونات زمنية.

على سبيل المثال، عند التعامل مع البيانات الشهرية، غالبًا ما يكون من الشائع مقارنة التواريخ BETWEEN first AND last, ، ولكن من الناحية العملية عادة ما يكون هذا أسهل في الكتابة dt >= first AND dt < next-first (والذي يحل أيضًا مشكلة الجزء الزمني) - منذ تحديد last عادة ما تكون خطوة واحدة أطول من التحديد next-first (بطرح يوم).

بالإضافة إلى ذلك، هناك مشكلة أخرى تتمثل في ضرورة تحديد الحدود الدنيا والعليا في ملف طلب صحيح (أي. BETWEEN low AND high).

عادة، ليس هناك فرق - و BETWEEN الكلمة الأساسية غير مدعومة على جميع منصات RDBMS، ولكن إذا كان الأمر كذلك، فيجب أن يكون الاستعلامان متطابقين.

وبما أنهما متطابقان، فليس هناك أي تمييز من حيث السرعة أو أي شيء آخر - استخدم ما يبدو أكثر طبيعية بالنسبة لك.

كما ذكر @marc_s وCloud وآخرون.إنهم في الأساس نفس الشيء بالنسبة لنطاق مغلق.

ولكن أي قيم زمنية كسرية قد تسبب مشكلات في نطاق مغلق (أكبر أو يساوي و أقل أو متساوية) على عكس النطاق نصف المفتوح (أكبر أو يساوي و أقل من) بقيمة نهائية بعد آخر لحظة ممكنة.

لذلك لتجنب إعادة كتابة الاستعلام على النحو التالي:

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

منذ BETWEEN لا يعمل مع الفواصل الزمنية نصف المفتوحة، وأقوم دائمًا بإلقاء نظرة فاحصة على أي استعلام تاريخ/وقت يستخدمه، لأنه من المحتمل أن يكون خطأ.

أعتقد أن الاختلاف الوحيد هو مقدار السكر النحوي في كل استعلام.BETWEEN هي مجرد طريقة رائعة لقول نفس الاستعلام الثاني تمامًا.

قد يكون هناك بعض الاختلاف المحدد في نظام RDBMS الذي لست على علم به، لكنني لا أعتقد ذلك حقًا.

لدي تفضيل طفيف ل 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, بالطبع، سيكون هناك خطأ في بناء الجملة وسيتم إصلاحه على الفور.

منطقيا لا يوجد فرق على الإطلاق.من حيث الأداء - عادةً، في معظم أنظمة إدارة قواعد البيانات - لا يوجد فرق على الإطلاق.

انظر الى هذا وظيفة بلوق ممتازة من آرون برتراند حول سبب وجوب تغيير تنسيق السلسلة وكيفية التعامل مع قيم الحدود في استعلامات النطاق الزمني.

تنصل:كل ما يلي هو مجرد قصصية ومستمدة مباشرة من تجربتي الشخصية.أي شخص يشعر بأنه قادر على إجراء تحليل أكثر صرامة تجريبيًا مرحب به للقيام به والتصويت ضده إذا كنت كذلك.أدرك أيضًا أن SQL هي لغة تعريفية وليس من المفترض أن تفكر في كيفية معالجة التعليمات البرمجية الخاصة بك عند كتابتها، ولكن لأنني أقدر وقتي، فأنا أقدر ذلك.

هناك عدد لا حصر له من العبارات المتكافئة منطقيًا، لكنني سأفكر في ثلاثة منها.

حالة 1:مقارنتان بترتيب قياسي (أمر التقييم ثابت)

A >= MinBound وA <= MaxBound

الحالة 2:السكر النحوي (لم يتم اختيار ترتيب التقييم من قبل المؤلف)

بين MinBound وMaxBound

الحالة 3:مقارنتان بترتيب تعليمي (يتم اختيار ترتيب التقييم في وقت الكتابة)

أ >= MinBound و A >= MaxBound

أو

أ >= ماكس باوند و أ >= مين باوند

في تجربتي، لا يوجد أي اختلافات ثابتة أو ملحوظة في الحالة 1 والحالة 2 في الأداء لأنهما يجهلان مجموعة البيانات.

ومع ذلك، يمكن للحالة 3 تحسين أوقات التنفيذ بشكل كبير.على وجه التحديد، إذا كنت تعمل مع مجموعة بيانات كبيرة ولديك بعض المعرفة الإرشادية حول ما إذا كان الأمر كذلك أم لا أ من المرجح أن يكون أكبر من ماكس باوند أو أقل من MinBound يمكنك تحسين أوقات التنفيذ بشكل ملحوظ باستخدام الحالة 3 وترتيب المقارنات وفقًا لذلك.

إحدى حالات الاستخدام التي أستخدمها هي الاستعلام عن مجموعة بيانات تاريخية كبيرة ذات تواريخ غير مفهرسة للسجلات ضمن فترة زمنية محددة.عند كتابة الاستعلام، سيكون لدي فكرة جيدة عما إذا كان هناك المزيد من البيانات قبل الفاصل الزمني المحدد أو بعد الفاصل الزمني المحدد ويمكنني ترتيب المقارنات وفقًا لذلك.لقد تم تخفيض أوقات التنفيذ بما يصل إلى النصف اعتمادًا على حجم مجموعة البيانات وتعقيد الاستعلام وكمية السجلات التي تمت تصفيتها بواسطة المقارنة الأولى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top