गैर-नियतात्मक कार्य के अलावा, मुझे जो समस्या दिखाई दे रही है वह यह है कि आप किसी क्षेत्र पर गणना करते हैं। यह (आमतौर पर) क्वेरी द्वारा फ़ील्ड पर किसी भी इंडेक्स को अनुपयोगी बनाता है।
इस लिंक का दूसरा पैराग्राफ़ (दस सामान्य SQL प्रोग्रामिंग गलतियाँ (विधेय में अनुक्रमित स्तंभों पर कार्य) ) इस बारे में अधिक विस्तृत जानकारी प्रदान करता है कि ऐसा कब होता है, इससे कैसे बचा जाए और कैसे कभी-कभी ऑप्टिमाइज़र फ़ंक्शन के उपयोग के बावजूद इंडेक्स का उपयोग कर सकते हैं।
संक्षेप में, बेहतर अनुकूलक पर भरोसा करने के बजाय, अक्सर फ़ील्ड को अक्षुण्ण रखकर (उस पर कोई गणना किए बिना) क्वेरी को बदलना संभव होता है, लेकिन इसके बजाय अन्य मानों के लिए (उलट) गणना करना। आपके मामले में GetDate()
. द्वारा प्रदान की गई वर्तमान तिथि तक . फिर क्वेरी फ़ील्ड की अनुक्रमणिका का उपयोग कर सकती है table1.Date
।
तो, आप कुछ इस तरह उपयोग कर सकते हैं:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
और आपको केवल उन कार्यों को खोजने की आवश्यकता है जो आपको चालू माह का पहला और अंतिम दिन प्रदान करते हैं।
यह ब्लॉग पोस्ट आपकी मदद कर सकता है:sql-server-query-to-find-first-and-last-day-of-current-month/
इससे भी बेहतर, यह स्टैक ओवरफ्लो प्रश्न/उत्तर:सरलतम-तरीका-से-बनाने-एक-तारीख-वह-द-द-द-द-द-द-द-द-द-महीना दिया गया -एक और तारीख
मुझे परीक्षण करना होगा लेकिन मुझे लगता है कि उपरोक्त की यह मामूली भिन्नता काम करेगी:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
>= /* First Day of Current Month */
DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0)
AND table1.Date
< /* First Day of Next Month */
DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0)