यह एक सूत्र के लिए बहुत सारे प्रश्न हैं .. लेकिन मैं उनमें से अधिकांश को संबोधित करने का प्रयास करूंगा। (पहला प्रश्न आप स्वयं उत्तर दे सकते हैं, बस इसे आजमाकर;-)
जहां तक क्वेरी की बात है, भले ही वह बिना किसी त्रुटि के चली हो - इसमें सुधार किया जा सकता है। मैं आपके लिए क्वेरी फिर से नहीं लिखूंगा, लेकिन यहां मुख्य मुद्दे हैं
-
पहला, कभी नहीं सीधे SQL में कच्चे क्लाइंट मानों का उपयोग करें। हमेशा
cfqueryparam
. का उपयोग करें एसक्यूएल इंजेक्शन से बचाने के लिए। इसके अन्य लाभ भी हैं, लेकिन वेब एप्लिकेशन में यह महत्वपूर्ण है। -
दूसरा, आप तारीख तार . में गुजर रहे हैं . दिनांक स्ट्रिंग अस्पष्ट हैं और पार्सिंग करने वाले प्रारूप और टूल के आधार पर गलत व्याख्या की जा सकती है। यह बहुत बेहतर उपयोग दिनांक वस्तुओं . है बजाय। ऐसा करने का एक तरीका है
cfqueryparam
. का उपयोग करना और दिनांक प्रकारों में से एक:cf_sql_date
(केवल तारीख) याcf_sql_timestamp
(तिथि और समय)। -
तीसरा, जैसा कि मैंने आपका अन्य सूत्र पर उल्लेख किया है , आपको वास्तव में अपनी क्वेरी को सरल बनाने की आवश्यकता है! कई सबक्वेरी पहले से ही बोझिल हैं .. प्रत्येक सबक्वेरी में डेट फिल्टर जोड़ने से यह पूरी तरह से असहनीय हो जाता है। मैं इसे सरल बनाने के तरीकों को देखने की सलाह दूंगा। एड का सुझाव एक संभावना की पेशकश की, इसे एक
JOIN
. में कम करके और कुछ फ़ंक्शन कॉल।
वैसे वास्तव में आपका आईडीई दिखाता है . ऐसा ही है यह मनुष्यों को। यह वास्तव में उस तरह से संग्रहीत नहीं है। आंतरिक रूप से, तिथियों को बड़ी संख्या के रूप में संग्रहीत किया जाता है। हालांकि, आपकी क्वेरी को इस तथ्य पर ध्यान देने की आवश्यकता है कि आपका कॉलम और . एक तिथि संग्रहीत करता है समय।
मान लें कि आप दिनांक के सभी रिकॉर्ड पुनर्प्राप्त करना चाहते हैं जून में:
form.startDate = "06/01/2013"
form.endDate = "06/30/2013"
संकल्पनात्मक रूप से, आपको इस तरह एक sql एक्सप्रेशन की आवश्यकता होगी:
WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM'
हालांकि, उन दिनांक/समय मानों का निर्माण करना थोड़ा सा आईएमओ है। इसे संभालने का एक आसान तरीका इस प्रतिमान का उपयोग करना है:
WHERE column >= {startDateAtMidnight}
AND column < {dayAfterEndDateAtMidnight}
आपका वास्तविक क्वेरी फ़िल्टर कुछ इस तरह दिखाई देगा:
WHERE column >= <cfqueryparam value="#form.startDate#"
cfsqltype="cf_sql_date">
AND column < <cfqueryparam value="#dateAdd('d', 1, form.endDate)#"
cfsqltype="cf_sql_date">
form.endDate
. में एक दिन जोड़कर , और एक <
. का उपयोग करके तुलना, परिणामी क्वेरी है:
WHERE column >= '2013-06-01 00:00:00'
AND column < '2013-07-01 00:00:00'
यह ठीक वैसा ही परिणाम देगा जैसा कि पहले BETWEEN एक्सप्रेशन था।