ओरेकल डेटाइम कहाँ क्लॉज़ में?


84

मेरे पास sql कुछ इस तरह है:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')

-> यह 10 पंक्तियों और TIME_CREATED = '26 -JAN-2011 'लौटाता है

अब जब मैं ऐसा करता हूं तो मुझे कोई पंक्तियां वापस नहीं मिलती हैं,

SELECT EMP_NAME, DEPT
    FROM EMPLOYEE
    WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')

-> बाहर से अधिक लिया

कोई भी कारण क्यों?


4
आपको भाषा पर निर्भर दिनांक प्रारूपों से बचना चाहिए। जो विभिन्न प्रणालियों पर परेशानी पैदा कर सकता है। आप का उपयोग करना चाहिए 01के बजाय JAN(प्लस निश्चित रूप से approriate प्रारूप) सुनिश्चित करें कि किसी भी प्रणाली पर समस्या के बिना अपने कोड रन बनाने के लिए।
a_horse_with_no_name

जवाबों:


149

हां: TIME_CREATE में एक दिनांक और एक समय होता हैTRUNCसमय पट्टी करने के लिए उपयोग करें :

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

अद्यतन:
जैसा कि डेव कोस्टा नीचे टिप्पणी में बताते हैं, यह ओरेकल को स्तंभ के सूचकांक का उपयोग करने से रोक देगा TIME_CREATEDयदि यह मौजूद है। इस समस्या के बिना एक वैकल्पिक दृष्टिकोण यह है:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') 
      AND TIME_CREATED < TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1

14
ध्यान दें कि यह दृष्टिकोण TIME_CREATED पर एक इंडेक्स के उपयोग को रोक देगा, यदि कोई मौजूद है।
डेव कोस्टा

समाधान पोस्ट करने के लिए धन्यवाद। यह त्वरित और खोजने में आसान था। जबकि मैंने अन्य DBMS जैसे कि Ingres, MS-SQL, MS-Access और DB2 पर काम किया है, मैंने अपने वर्तमान असाइनमेंट से पहले Oracle के साथ काम नहीं किया है।
जेसन TEPOORTEN

उपयोग क्यों नहीं BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1?
अजेह

2
@ हजीह: मुझे betweenअस्पष्टता के कारण पसंद नहीं है। ऐसा लगता है जैसे यह विशेष सीमा है जब वास्तव में यह समावेशी है। इसलिए मैं इससे बचता हूं। इसके अलावा, इस ठोस उदाहरण में, यह समान नहीं होगा।
डैनियल हिल्गारथ

28

आप अपनी क्वेरी में TIME भाग को शामिल करने के लिए निम्नलिखित का उपयोग कर सकते हैं:

SELECT EMP_NAME
     , DEPT
  FROM EMPLOYEE 
 WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');


7

ऐसा इसलिए है क्योंकि DATEOracle में एक कॉलम में एक समय भाग भी होता है। to_date()फ़ंक्शन का परिणाम निर्धारित समय के साथ एक तारीख है 00:00:00और इस प्रकार यह संभवतः तालिका में किसी भी पंक्तियों से मेल नहीं खाता है।

आपको उपयोग करना चाहिए:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

5

जैसा कि अन्य लोगों ने ऊपर टिप्पणी की है, TRUNC के उपयोग से अनुक्रमितों का उपयोग रोका जा सकेगा (यदि TIME_CAT पर एक सूचकांक था)। उस समस्या से बचने के लिए, क्वेरी को संरचित किया जा सकता है

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') 
            AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + INTERVAL '86399' second;

86399 एक दिन में सेकंड की संख्या से 1 सेकंड कम है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.