सही दृष्टिकोण
को नज़रअंदाज़ करना एक पल के लिए, ऐसा होने का कारण यह है कि आप गलत cfsqltype
. का उपयोग कर रहे हैं मापदंडों के लिए। तो आप वास्तव में डेटाबेस में अलग-अलग मान भेज रहे हैं (और परिणामस्वरूप एक अलग तुलना कर रहे हैं) जितना आप सोच रहे हैं। परिणामस्वरूप, क्वेरी किसी भी मेल खाने वाले रिकॉर्ड को खोजने में विफल रहती है। इसलिए आपका चार्ट खाली है।
cf_sql_timestamp
. का उपयोग करके आप "मान" को पूर्ण दिनांक/समय वस्तु में परिवर्तित कर रहे हैं। हालांकि, YEAR()ए> केवल चार अंकों की संख्या देता है। तो आप सेब और संतरे की तुलना कर रहे हैं। संकल्पनात्मक रूप से, आपकी क्वेरी वास्तव में ऐसा कर रही है:
WHERE 2014 = {ts '2009-02-13 23:31:30'}
इसका कोई त्रुटि नहीं होने का कारण यह है कि दिनांक/समय मान आंतरिक रूप से संख्याओं के रूप में संग्रहीत किए जाते हैं। तो आप वास्तव में एक छोटी संख्या (यानी वर्ष) की तुलना वास्तव में बड़ी संख्या (यानी दिनांक/समय) से कर रहे हैं। जाहिर है कि तारीख का मूल्य बहुत बड़ा होगा, इसलिए यह लगभग कभी भी वर्ष की संख्या से मेल नहीं खाएगा। फिर से, अवधारणात्मक रूप से आपकी क्वेरी यह कर रही है:
WHERE 2014 = 1234567890
चूंकि cfsqltype वैकल्पिक है, बहुत से लोग सोचते हैं कि यह बहुत महत्वपूर्ण नहीं है - लेकिन यह है।
-
सत्यापन: इसके अन्य लाभों के अलावा, cfqueryparam आपूर्ति किए गए "मान" को
cfsqltype
के आधार पर मान्य करता है। (तारीख, तारीख और समय, संख्या, वगैरह)। यह पहले . होता है एसक्यूएल कभी भी डेटाबेस में भेजा जाता है। इसलिए यदि इनपुट अमान्य है, तो आप डेटाबेस कॉल को बर्बाद नहीं करते हैं। यदि आप cfsqltype को छोड़ देते हैं, या केवल डिफ़ॉल्ट यानी स्ट्रिंग का उपयोग करते हैं, तो आप उस अतिरिक्त सत्यापन को खो देते हैं। -
सटीकता उचित cfsqltype का चयन सुनिश्चित करता है कि आप डेटाबेस को सही मान भेज रहे हैं। जैसा कि ऊपर दिखाया गया है, गलत प्रकार का उपयोग करने से CF डेटाबेस को गलत मान भेज सकता है।
cfsqltype
यह भी सुनिश्चित करता है कि गैर-अस्पष्ट प्रारूप में डेटाबेस में मान सबमिट किए गए हैं, डेटाबेस आपकी अपेक्षा के अनुसार व्याख्या करेगा। तकनीकी रूप से आप डेटाबेस को सब कुछ एक स्ट्रिंग भेज सकते हैं। हालांकि, यह डेटाबेस को अंतर्निहित रूपांतरण (आमतौर पर अवांछनीय)।निहित रूपांतरण के साथ, स्ट्रिंग्स की व्याख्या पूरी तरह से डेटाबेस तक छोड़ दी जाती है - और यह हमेशा उस उत्तर के साथ नहीं आ सकता है जिसकी आप अपेक्षा करते हैं। दिनांक वस्तुओं के बजाय तारीखों को तार के रूप में जमा करना, इसका एक प्रमुख उदाहरण है। वर्तमान डेटाबेस "05/04/2014" जैसे दिनांक स्ट्रिंग की व्याख्या कैसे करेगा? 5 अप्रैल या 4 मई के रूप में? निर्भर करता है। डेटाबेस या डेटाबेस सेटिंग्स बदलें और परिणाम पूरी तरह से अलग हो सकता है।
सुसंगत परिणाम सुनिश्चित करने का एकमात्र तरीका उपयुक्त cfsqltype निर्दिष्ट करना है। यह तुलना कॉलम/फ़ंक्शन के डेटा प्रकार से मेल खाना चाहिए, या कम से कम एक समकक्ष प्रकार से मेल खाना चाहिए। YEAR()
. के मामले में , यह चार अंकों की संख्या देता है। तो आपको cf_sql_integer
. का उपयोग करना चाहिए , जैसा कि एड्रियन ने टिप्पणियों का उल्लेख किया
. वही आपके MONTH()<पर लागू होता है /ए> तुलना।
WHERE Year(ColumnName) = <cfqueryparam value="2014" cfsqltye="CF_SQL_INTEGER">
AND Month(ColumnName) = <cfqueryparam value="11" cfsqltye="CF_SQL_INTEGER">
अब यह सब कहने के बाद, डैन का सुझाव
दिनांक तुलना करने का बेहतर तरीका है। वह प्रतिमान
यह अधिक इंडेक्स फ्रेंडली है और इस पर ध्यान दिए बिना काम करता है कि आपके लक्षित कॉलम में एक तिथि (केवल) या एक तिथि और समय है या नहीं। cf_sql_date
के उपयोग पर ध्यान दें उसके उदाहरण में।
cf_sql_timestamp
- दिनांक और समय दोनों भेजता हैcf_sql_date
- केवल एक तारीख भेजता है। समय मान छोटा कर दिया गया है