कभी भी, कभी भी TO_DATE()
का उपयोग न करें किसी ऐसी चीज़ पर जो पहले से ही एक DATE
है . इसका कारण यह है कि Oracle को आपकी इच्छाओं का पालन करने के लिए कुछ अंतर्निहित रूपांतरण करने होंगे:
TO_DATE(sysdate, 'mm-yyyy')
वास्तव में
. के रूप में चलाया जाता है
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
इसलिए यदि आपका nls_date_format 'mm-yyyy' के अलावा किसी अन्य चीज़ पर सेट है, तो आपको समस्याएँ होने वाली हैं। डिफ़ॉल्ट nls_date_format पैरामीटर 'DD-MON-YY' है, जो आपके द्वारा सेट किए गए मान से कहीं अधिक है।
यदि आप केवल चालू माह की पहली तारीख को जोड़ना चाहते हैं, तो आपको TRUNC()
का उपयोग करना चाहिए। , जैसे:
add_months(trunc(sysdate, 'MM'),-12)
यहाँ निहित to_char का प्रमाण है यदि आप किसी ऐसी चीज़ को डेट करना चाहते हैं जो पहले से ही एक तारीख है, जैसा कि ललित द्वारा अनुरोध किया गया है - to_date(sysdate) से जुड़ी एक मूल क्वेरी की निष्पादन योजना:
SQL_ID 3vs3gzyx2gtcn, child number 0
-------------------------------------
select * from dual where to_date(sysdate) < sysdate
Plan hash value: 3752461848
----------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_DATE(TO_CHAR([email protected]!))<[email protected]!)
आप स्पष्ट रूप से देख सकते हैं TO_CHAR()
फ़िल्टर की स्थिति में।