आपके आउटपुट को देखते हुए ऐसा लगता है कि आपने START_DATE को टाइमस्टैम्प के रूप में परिभाषित किया है। यदि यह एक नियमित तिथि होती तो Oracle निहित रूपांतरण को संभालने में सक्षम होता। लेकिन ऐसा नहीं है कि आपको तारीखों के लिए उन स्ट्रिंग्स को स्पष्ट रूप से डालने की आवश्यकता है।
SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
2 /
Session altered.
SQL>
SQL> select * from t23
2 where start_date between '15-JAN-10' and '17-JAN-10'
3 /
no rows selected
SQL> select * from t23
2 where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
3 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
SQL>
लेकिन हमें अभी भी केवल एक पंक्ति मिलती है। ऐसा इसलिए है क्योंकि START_DATE में एक समय तत्व है। यदि हम समय घटक निर्दिष्ट नहीं करते हैं तो Oracle इसे मध्यरात्रि में डिफॉल्ट करता है। यह से . के लिए ठीक है BETWEEN
. के किनारे लेकिन तक . के लिए नहीं पक्ष:
SQL> select * from t23
2 where start_date between to_date('15-JAN-10')
3 and to_date('17-JAN-10 23:59:59')
4 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
Product 1 17-JAN-10 04.31.32.000
SQL>
संपादित करें
यदि आप समय घटक में पास नहीं कर सकते हैं तो कुछ विकल्प हैं। पहला यह है कि मापदंड से समय तत्व को हटाने के लिए WHERE क्लॉज को बदला जाए:
where trunc(start_date) between to_date('15-JAN-10')
and to_date('17-JAN-10')
इसका प्रदर्शन पर प्रभाव पड़ सकता है, क्योंकि यह START_DATE को किसी भी b-tree अनुक्रमणिका को अयोग्य घोषित कर देता है। आपको इसके बजाय फ़ंक्शन-आधारित अनुक्रमणिका बनाने की आवश्यकता होगी।
वैकल्पिक रूप से आप अपने कोड में दिनांक में समय तत्व जोड़ सकते हैं:
where start_date between to_date('15-JAN-10')
and to_date('17-JAN-10') + (86399/86400)
इन समस्याओं के कारण बहुत से लोग between
. के उपयोग से बचना पसंद करते हैं इस तरह दिनांक सीमाओं की जाँच करके:
where start_date >= to_date('15-JAN-10')
and start_date < to_date('18-JAN-10')