तो बात यह है कि ओरेकल टाइमस्टैम्प और ओरेकल तिथियां दो अलग-अलग डेटाटाइप हैं। किसी टाइमस्टैम्प की किसी तिथि से तुलना करने के लिए Oracle को एक रूपांतरण चलाना होता है - वह INTERNAL_FUNCTION ()। दिलचस्प डिजाइन निर्णय यह है कि ओरेकल पास किए गए मान के बजाय टेबल कॉलम को परिवर्तित करता है, जिसका अर्थ है कि क्वेरी अब इंडेक्स का उपयोग नहीं करती है।
मैं SQL*प्लस में आपके परिदृश्य को पुन:पेश करने में सक्षम रहा हूं, इसलिए java.sql.Timestamp
का उपयोग करने में कोई समस्या नहीं है। . पारित टाइमस्टैम्प को तारीखों में कास्ट करने से समस्या का समाधान हो जाता है...
SQL> explain plan for
2 select * from test1
3 where d1 > cast(to_timestamp('01-MAY-2011 00:00:00.000', 'DD-MON-YYYY Hh24:MI:SS.FF') as date)
4 and d2 > cast(to_timestamp('01-JUN-2011 23:59:59.999', 'DD-MON-YYYY Hh24:MI:SS.FF') as date)
5 /
Explained.
SQL> select * from table(dbms_xplan.display)
2 /
PLAN_TABLE_OUTPUT
-----------------------------------------------------------
Plan hash value: 1531258174
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 25 | 500 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST1 | 25 | 500 | 3 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | T1_I | 1 | | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------
2 - access("D1">CAST(TO_TIMESTAMP('01-MAY-2011 00:00:00.000','DD-MON-YYYY
Hh24:MI:SS.FF') AS date) AND "D2">CAST(TO_TIMESTAMP('01-JUN-2011
23:59:59.999','DD-MON-YYYY Hh24:MI:SS.FF') AS date) AND "D1" IS NOT NULL)
filter("D2">CAST(TO_TIMESTAMP('01-JUN-2011 23:59:59.999','DD-MON-YYYY
Hh24:MI:SS.FF') AS date))
18 rows selected.
SQL>
लेकिन मुझे नहीं लगता कि इससे आपको कोई मदद मिलती है:इसके बजाय सिर्फ तारीखें पास करना आसान होगा।
दिलचस्प बात यह है कि दिनांक कॉलम को टाइमस्टैम्प पर कास्टिंग करने वाले फ़ंक्शन-आधारित इंडेक्स का निर्माण करने से मदद नहीं मिलती है। INTERNAL_FUNCTION()
कॉल को CAST()
के रूप में पहचाना नहीं गया है और सूचकांक को नजरअंदाज कर दिया जाता है। INTERNAL_FUNCTION()
. का उपयोग करके एक अनुक्रमणिका बनाने का प्रयास कर रहा है एक ORA-00904 फेंकता है।