Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

दिनांक डेटा प्रकार के लिए बराबर (=) बनाम LIKE

मान लें कि 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 ) तो निश्चित रूप से तिथियां समान नहीं हैं।

इस समस्या को हल करने के लिए आपके पास अलग-अलग विकल्प हैं:

  1. उपयोग trunc() टेबल कॉलम पर 00:00 . के समय को "सामान्य" करने के लिए trunc(LAST_TRANSACTION_DATE) = DATE '2007-07-30 हालांकि यह LAST_TRANSACTION_DATE को परिभाषित इंडेक्स के उपयोग को रोकेगा
  2. 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' के रूप में संसाधित किया जाता है

याद रखने योग्य महत्वपूर्ण बातें:

  1. कभी भी, अंतर्निहित डेटा प्रकार रूपांतरण पर भरोसा न करें। यह करेगा आपको किसी बिंदु पर समस्याएँ देते हैं। हमेशा सही डेटा प्रकारों की तुलना करें
  2. ओरेकल DATE कॉलम में हमेशा एक समय होता है जो तुलना नियमों का हिस्सा होता है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल प्रक्रिया सी # में बूलियन पैरामीटर कैसे पास करें

  2. ऑरैकल 18 में json_table के माध्यम से पार्स जोंस

  3. Oracle प्रक्रिया में इनपुट पैरामीटर के रूप में डेटा की एक सरणी पास करना

  4. ऑरैकल टाइमस्टैम्प में दूसरा कैसे जोड़ें

  5. अपूर्ण पुनर्प्राप्ति के बाद डेटाबेस की जांच कैसे करें संगत है