2010-07-20 9 views
11

मैं अपने ग्राहक के लिए एक चार्ट बनाने पर काम कर रहा हूं और वे 24 घंटे, 3 दिन, 1 सप्ताह, 1 महीने, आदि अवधि में कुल ग्राहक गणना प्राप्त करना चाहते हैं। मैं ईमानदारी से एसक्यूएल के साथ सबसे अच्छा नहीं हूँ, इसलिए इन प्रश्नों को उत्पन्न करना मेरे फोर्टे नहीं हैं।टी-एसक्यूएल में पिछले 24 घंटे के परिणाम प्राप्त करने का सबसे अच्छा तरीका क्या है?

ग्राहकों को 24 घंटे से अधिक प्राप्त करने के संबंध में, मैं दो "कहां" बयान में आया हूं जो काम कर सकते हैं, लेकिन मुझे यकीन नहीं है कि कौन सा सबसे अच्छा है।

प्रथम संस्करण:

WHERE DATEDIFF(hh,CreatedDate,GETDATE())>24 

दूसरा संस्करण:

WHERE CreatedDate >= DATEADD(HH, -24, GETDATE()) 

पहला संस्करण 21 पंक्तियों उत्पन्न करता है और दूसरा (, एक ही डाटासेट से निश्चित रूप से) 17 पंक्तियों उत्पन्न करता है तो जाहिर है कि एक दूसरे की तुलना में अधिक सटीक है। मैं पहले की तरफ झुका रहा हूं, लेकिन मुझे आपकी राय चाहिए ... कृपया।

धन्यवाद, एंड्रयू

+0

मुझे लगता है कि 'कहां DateDiff (hh, CreatedDate, GETDATE())> 24'' होने के लिए जहां DateDiff (hh, CreatedDate, GETDATE()) <24' –

+1

की जरूरत है। .. और अधिक सटीक रूप से, 'दूसरे के तर्क से मेल खाने के लिए दिनांक (एचएच, बनाया गया, GETDATE()) <= 24' कहां है :) –

उत्तर

8

पहले संस्करण से बचें। सबसे पहले, क्योंकि यह इंडेक्स उपयोग अक्षम करता है। पहले संस्करण के साथ दूसरा (कार्यात्मक) मुद्दा है, DATEDIFF(HOUR...) 25 घंटे से कम सभी मान देता है। स्पष्टता के लिए इसे आज़माएं:

SELECT DATEDIFF(HOUR, '2010-07-19 00:00:00', '2010-07-20 00:59:59.99') 
1

शायद ये आपके प्रत्येक खंड के लिए हो सकता है?

WHERE CreatedDate < GETDATE() AND CreatedDate >= DATEADD(hh, -24, GETDATE) 

WHERE CreatedDate < GETDATE() AND CreatedDate >= DATEADD(day, -3, GETDATE) 

WHERE CreatedDate < GETDATE() AND CreatedDate >= DATEADD(wk, -1, GETDATE) 

WHERE CreatedDate < GETDATE() AND CreatedDate >= DATEADD(mm, -1, GETDATE) 

और इंडेक्स के बारे में फ़्लो के रूप में, बस सुनिश्चित करें कि आप अपने निर्मितडेट कॉलम को अनुक्रमणित कर रहे हैं।

8

पहला संस्करण सटीक नहीं है।

WHERE DateDiff(hh, CreatedDate, GETDATE()) > 24 

यह 23.0001 घंटे पहले से 24.9999 घंटे के बीच कहीं न कहीं मान वापस आ जाएगी पहले क्योंकि आप गिनती कर रहे हैं "सीमाओं को पार कर", न कि वास्तविक 24 घंटे की अवधि। गौर करें कि 1:59:59 से 2:00:00 केवल एक सेकंड है, लेकिन DateDiff घंटों तक 1 घंटे वापस आ जाएगा। इसी प्रकार, 1:00:00 से 2:59:59 लगभग 2 घंटे है, लेकिन DateDiff घंटों तक उसी 1 घंटे लौटाता है।

दूसरा संस्करण सही है।

WHERE CreatedDate >= DateAdd(hh, -24, GETDATE()) 

वर्तमान तिथि में 24 घंटे जोड़ना, 24.0 घंटे पहले मिलीसेकंड में एक समय देगा। इस प्रकार 24 घंटों का डेटा वापस आ जाएगा।

इसके अलावा, पहला संस्करण खराब होगा, भले ही आप यही चाहते थे क्योंकि इंजन को पूरी तालिका में प्रत्येक पंक्ति पर दिनांक गणित करना होगा, जिससे किसी भी संभावित इंडेक्स बेकार हो और अनावश्यक CPU का समूह बन जाए। इसके बजाय, कॉलम नाम से अभिव्यक्ति के विपरीत तरफ गणित करें।प्रदर्शन दंड के बिना अपने पहली अभिव्यक्ति के तर्क डुप्लिकेट बनाने के लिए इस तरह दिखेगा:

WHERE CreateDate >= DateAdd(hh, DateDiff(hh, 0, GETDATE()) - 24, 0) 

उदाहरण:

  • GetDate() = '20100720 17:52'
  • DateDiff(hh, 0, '20100720 17:52') = 969065
  • DateAdd(hh, 969065 - 24, 0) = '20100719 17:00'

और साबित करने के लिए यह आपकी पहली अभिव्यक्ति जैसा ही है:

  • DateDiff(hh, '20100719 17:00', '20100720 17:52') = 24
संबंधित मुद्दे