प्रश्न: क्यों एसक्यूएल का बीटा समावेशी है?
उत्तर: क्योंकि SQL भाषा डिजाइनरों ने एक खराब डिज़ाइन निर्णय लिया, जिसमें वे सिंटैक्स देने में विफल रहे, जो डेवलपर्स को बीटाविलेन (बंद, अर्ध-खुले-बाएं, अर्ध-खुले-दाएं, या खुले के 4 प्रकारों को निर्दिष्ट करने की अनुमति देगा) ) वे पसंद करेंगे।
सिफारिश: जब तक / जब तक SQL मानक में संशोधन नहीं किया जाता है, दिनांक / समय के लिए BETWEEN का उपयोग न करें। इसके बजाय अपने बीटा रेंज की शुरुआत और अंत सीमाओं पर स्वतंत्र परिस्थितियों के रूप में DATE रेंज की तुलना कोडिंग की आदत डालें। यह थोड़ा वर्बोज़ है, लेकिन आपको उन शर्तों को लिखना छोड़ देगा जो सहज (इस तरह छोटी गाड़ी होने की संभावना) कम हैं और डेटाबेस ऑप्टिमाइज़र के लिए स्पष्ट हैं, इष्टतम निष्पादन योजनाओं को निर्धारित करने और इंडेक्स का उपयोग करने की अनुमति देता है।
उदाहरण के लिए, यदि आपकी क्वेरी इनपुट दिवस विनिर्देश को स्वीकार कर रही है और उस तारीख को गिने गए सभी रिकॉर्ड वापस करना चाहिए, तो आप इस रूप में कोड करेंगे:
WHERE DATE_FIELD >= :dt AND DATE_FIELD < :dt+1
BETWEEN जोखिम प्रदर्शन मुद्दों और / या छोटी गाड़ी कोड का उपयोग करके तर्क लिखने की कोशिश कर रहा है। तीन आम गलतियाँ:
1) WHERE DATE_FIELD BETWEEN :dt AND :dt+1
यह लगभग निश्चित रूप से एक बग है - उपयोगकर्ता किसी विशेष तिथि के लिए केवल रिकॉर्ड देखने की उम्मीद करता है, फिर भी एक दिन एक रिपोर्ट के साथ अगले दिन के 12:00 बजे रिकॉर्ड होगा।
2) WHERE TRUNC(DATE_FIELD) = :dt
सही उत्तर देता है, लेकिन DATE_FIELD को फ़ंक्शन को लागू करने से अधिकांश अनुक्रमण / आँकड़े बेकार हो जाएंगे (हालांकि कभी-कभी DBA फ़ंक्शन-आधारित अनुक्रमणिकाओं को दिनांक फ़ील्ड में जोड़कर मदद करने का प्रयास करेंगे - फिर भी मैन-घंटे और डिस्क स्थान को जलाना और IUD में ओवरहेड जोड़ना होगा मेज पर संचालन)
3) WHERE EVENT_DATE BETWEEN :dt AND :dt + 1-1/24/60/60
ओरेकल गुरु असाधारण, टॉम कायटे, इस कम-से-सुरुचिपूर्ण (आईएमओ) समाधान की सिफारिश करते हैं। जब तक आप पूरा दिन व्यतीत नहीं करते तब तक काम करता है कि "1-1 / 24/06/60" एक क्वेरी में हो जो अपूर्ण परिणाम देता है ... या जब तक आप गलती से इसका उपयोग TIMESTAMP फ़ील्ड पर नहीं करते हैं। इसके अलावा, यह थोड़ा सा स्वामित्व है; Oracle के DATE डेटा प्रकार (जो दूसरे पर नज़र रखता है) के साथ संगत है, लेकिन विभिन्न डेटाबेस उत्पादों के DATE / TIME परिशुद्धता के लिए इसे समायोजित करने की आवश्यकता है।
समाधान: CLOSED / INCLUSIVE डिफ़ॉल्ट के विकल्पों के विनिर्देशन का समर्थन करने के लिए BETWEEN वाक्यविन्यास को संशोधित करके SQL भाषा ऐनक को बढ़ाने के लिए ANSI SQL समिति को याचिका। कुछ इस तरह से करेंगी ट्रिक:
expr1 बीच expr2 [ INCL [usive] | EXCL [usive]] और expr3 [ INCL [usive] | EXCL [USIVE]]
विचार करें कि व्यक्त करना कितना आसान है WHERE DATE_FIELD BETWEEN :dt INCLUSIVE AND :dt+1 EXCLUSIVE
(या सिर्फ WHERE DATE_FIELD BETWEEN :dt AND :dt+1 EXCL
)
शायद ANSI SQL: 2015?