2011-03-10 17 views
8

इस प्रकार मैं एक प्रश्न कर रही हूँ:एसक्यूएल DateDifference जहां खंड

SELECT 
    * 
FROM a 
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3; 

और काम नहीं कर रहा

मैं डेटा है कि 3 दिन से अधिक पुराना नहीं है प्राप्त करने की कोशिश हूँ।

SQL सर्वर।

यह कैसे करें?

DateDiff बहुत धीमी गति से काम करता है ..

उत्तर

24

DateDiff बेहद तेज़ है ... आपकी समस्या यह है कि आप इसे डेटाबेस तालिका कॉलम मान पर चला रहे हैं, इसलिए क्वेरी प्रोसेसर को तालिका में प्रत्येक पंक्ति पर फ़ंक्शन चलाने चाहिए, भले ही इस कॉलम पर कोई अनुक्रमणिका हो। इसका मतलब है कि इसे पूरी तालिका को डिस्क से लोड करना होगा।

इसके बजाय, आज की तारीख पर dateAdd फ़ंक्शन का उपयोग करें, और उस एकल गणना के परिणामस्वरूप डेटाबेस तालिका कॉलम की तुलना करें। अब यह केवल DateAdd() चलाता है, और यह केवल सूचकांक (यदि कोई मौजूद है) का उपयोग कर सकता है, केवल अनुमानित मानदंड से मेल खाने वाली पंक्तियों को लोड करने के लिए।

Where a.DateValue > DateAdd(day,-3,getdate())

इस तरह से यह कर आपकी क्वेरी विधेय SARG-able

+0

Sarg करने योग्य, मैंने पहले कि प्रतिक्रिया नहीं मिली है बनाता है। धन्यवाद! –

+0

'क्वेरी प्रोसेसर को तालिका में प्रत्येक पंक्ति पर फ़ंक्शन चलाने चाहिए' मुझे उस समस्या को समझने और हल करने में मेरी सहायता हुई, जहां सटीक वही DATEDIFF कथन WHERE खंड में ओवरफ़्लो के बारे में शिकायत करेगा लेकिन चयन में नहीं होगा। –

+0

मुझे एक सबक्वायरी के साथ परेशानी हो रही थी जो DATEDIFF के साथ जहां मुझे पागल बनाता है, आपका समाधान बहुत अच्छा था और वास्तव में मेरी मदद की। आपका बहुत बहुत धन्यवाद। – FabianSilva

0

आपकी क्वेरी बुरा नहीं लगता है। एक अन्य तरीका यह से निपटने के लिए होगा:

SELECT * FROM a WHERE a.DateValue > DATEADD(dd,-3,GETDATE()) 
संबंधित मुद्दे