मान लें कि LAST_TRANSACTION_DATE
एक DATE
है कॉलम (या TIMESTAMP
) तो दोनों संस्करण बहुत खराब अभ्यास हैं।
दोनों ही मामलों में DATE
कॉलम को वर्तमान एनएलएस सेटिंग्स के आधार पर एक अक्षर अक्षर में परिवर्तित कर दिया जाएगा। इसका मतलब है कि अलग-अलग क्लाइंट के साथ आपको अलग-अलग परिणाम मिलेंगे।
दिनांक अक्षर का उपयोग करते समय हमेशा to_date()
. का उपयोग करें with(!) एक प्रारूप मुखौटा या एक एएनएसआई तिथि शाब्दिक का उपयोग करें। इस तरह आप तारीखों की तुलना तारीखों से करते हैं न कि तार वाले तार से। तो समान तुलना के लिए आपको इसका उपयोग करना चाहिए:
LAST_TRANSACTION_DATE = to_date('30-JUL-07', 'dd-mon-yy')
ध्यान दें कि 'मोन' का उपयोग करने से अभी भी विभिन्न एनएलएस सेटिंग्स ('DEC'
के साथ त्रुटियां हो सकती हैं। बनाम 'DEZ'
या 'MAR'
बनाम 'MRZ'
) महीने की संख्याओं (और चार अंकों के वर्षों) का उपयोग करने में त्रुटि की संभावना बहुत कम होती है:
LAST_TRANSACTION_DATE = to_date('30-07-2007', 'dd-mm-yyyy')
या एएनएसआई तिथि शाब्दिक का उपयोग करना
LAST_TRANSACTION_DATE = DATE '2007-07-30'
अब इसका कारण यह है कि उपरोक्त क्वेरी के कुछ भी नहीं लौटाने की संभावना यह है कि Oracle में DATE
कॉलम में समय भी शामिल है। उपरोक्त दिनांक शाब्दिक में समय 00:00
निहित है . यदि तालिका में समय अलग है (उदा. 19:54
) तो निश्चित रूप से तिथियां समान नहीं हैं।
इस समस्या को हल करने के लिए आपके पास अलग-अलग विकल्प हैं:
- उपयोग
trunc()
टेबल कॉलम पर00:00
. के समय को "सामान्य" करने के लिएtrunc(LAST_TRANSACTION_DATE) = DATE '2007-07-30
हालांकि यहLAST_TRANSACTION_DATE
को परिभाषित इंडेक्स के उपयोग को रोकेगा between
का उपयोग करेंLAST_TRANSACTION_DATE between to_date('2007-07-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and to_date('2007-07-30 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
trunc(LAST_TRANSACTION_DATE)
पर एक इंडेक्स बनाकर पहले समाधान की प्रदर्शन समस्या को हल किया जा सकता है जिसका उपयोग उस अभिव्यक्ति द्वारा किया जा सकता है। लेकिन व्यंजक LAST_TRANSACTION_DATE = '30-JUL-07'
सूचकांक के उपयोग को भी रोकता है क्योंकि आंतरिक रूप से इसे to_char(LAST_TRANSACTION_DATE) = '30-JUL-07'
के रूप में संसाधित किया जाता है
याद रखने योग्य महत्वपूर्ण बातें:
- कभी भी, अंतर्निहित डेटा प्रकार रूपांतरण पर भरोसा न करें। यह करेगा आपको किसी बिंदु पर समस्याएँ देते हैं। हमेशा सही डेटा प्रकारों की तुलना करें
- ओरेकल
DATE
कॉलम में हमेशा एक समय होता है जो तुलना नियमों का हिस्सा होता है।