मूल कारण:
आप एक NUMBER . को रूपांतरित कर रहे हैं करने के लिए STRING , मान लें कि यह DATE है . 20111010
एक DATE नहीं है, यह एक NUMBER है। साथ ही, '20111010'
DATE नहीं है, यह STRING है। वे पूरी तरह से अलग हैं।
20111010
- NUMBER'20111010'
- STRINGTO_DATE('20111010','YYYYMMDD')
- दिनांक
त्रुटि:
SQL> SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual;
SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual
*
ERROR at line 1:
ORA-01481: invalid number format model
आपकी क्वेरी पर आ रहा है:
WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD')
BETWEEN TO_DATE(TO_CHAR(:fromDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
AND TO_DATE(TO_CHAR(:toDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
आप अनावश्यक रूप से रूपांतरण और स्वरूपण को जटिल बना रहे हैं।
टाइमस्टैम्प डेटाटाइप DATE . को एक एक्सटेंशन है डेटा प्रकार। DATE डेटाटाइप के डेटाटाइम तत्वों के अलावा, TIMESTAMP डेटाटाइप में 0 और 9 दशमलव स्थानों के बीच सटीकता के लिए एक सेकंड के अंश होते हैं, डिफ़ॉल्ट 6 होता है।
चूंकि आप TIMESTAMP . के साथ काम कर रहे हैं आप TO_TIMESTAMP का उपयोग कर सकते हैं .
DATE/TIMESTAMP अंकगणित करते समय , आपको डेटा प्रकार को वैसे ही छोड़ देना चाहिए और इसे स्ट्रिंग . में परिवर्तित नहीं करना चाहिए . आपको उपयोग करने की आवश्यकता हैTO_CHAR केवल प्रदर्शन . के लिए ।
अपने फ़िल्टर विधेय को इस प्रकार संशोधित करें:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
ऊपर, :fromDate
और :toDate
एक स्ट्रिंग . होना चाहिए और संख्या . नहीं ।
उदाहरण के लिए,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
या, TO_CHAR का उपयोग करें पहले रूपांतरित करने के लिए संख्या स्ट्रिंग . में :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM