2009-05-28 14 views
7

मैं रिकॉर्ड्स का एक समूह जोड़ने के लिए डेटाबेस दृश्य लिख रहा हूं जहां दिनांक कॉलम में मान पिछले 7 दिनों के भीतर है। ऐसा कुछ ऐसा दिखता है:मैं SQL व्यू में getdate() के उपयोग से कैसे बचूं?

CREATE VIEW RecentRecordSum AS 
SELECT  t.ID, 
      SUM(t.SomeValue) AS ValueSum 
FROM  SomeTable t 
WHERE  t.RecordDate >= DATEADD(d,-7,GETDATE()) 
GROUP BY t.ID 

क्या GETDATE() सीधे उस खंड में बिना इसे करने का कोई तरीका है?

मैं एसक्यूएल सर्वर 2000 और 2005

क्वेरी योजना को देखते हुए पता चलता है कि संपूर्ण क्वेरी का केवल 0.03% (जो एक की तुलना में काफी अधिक जटिल है है getdate() कॉल की लागत का उपयोग कर रहा उपर्युक्त), इसलिए प्रदर्शन कोई मुद्दा नहीं है, हालांकि मुझे अपने प्रश्नों को निर्धारक माना जाता है।

आदर्श रूप में मैं -7 पैरामीटर को कॉलम के रूप में बेनकाब करना चाहता हूं ताकि इसका उपयोग किसी क्वेरी के पूछताछ के खंड में किया जा सके। वर्तमान में मैं 7, 14, 28 दिन खिड़कियों के लिए विचारों की एक छोटी संख्या पर विचार कर रहा हूं।

+0

सुनिश्चित नहीं हैं कि अगर मैं सवाल को समझते हैं। जहां खंड में नहीं होगा तो यह कहां होगा? क्या आप किसी प्रकार के पैरामीटर के बारे में सोच रहे हैं जिसमें आप गुजरते हैं? – micahtan

+0

मुझे लगता है कि यह परिणामसेट की प्रत्येक पंक्ति के लिए GETDATE() का मूल्यांकन करने के प्रदर्शन हिट से बचने के लिए है। – Joe

+0

आप मानते हैं कि प्रत्येक पंक्ति के लिए इसका मूल्यांकन क्यों किया जाता है? – RedFilter

उत्तर

6

डेटा परिवर्तन को हटाकर दृश्य को और अधिक अनुकूल बनाने के लिए आपके प्रश्न का एक कारण हो सकता है। एक दृश्य में यह नहीं कर सकते, तो आप और यह एक संग्रहीत प्रक्रिया बनाने के लिए आवश्यकता होगी एक चर में बदलना कार्य करें: अंधेरे में

CREATE PROCEDURE RecentRecordSum AS 

DECLARE @adate DATETIME 

SELECT @adate = DATEADD(d, -7, GETDATE()) 

SELECT  t.ID, 
      SUM(t.SomeValue) AS ValueSum 
FROM  SomeTable t 
WHERE  t.RecordDate >= @adate 
GROUP BY t.ID 
0
SELECT CURRENT_TIMESTAMP 

SELECT {fn NOW()} 

मैं सवाल गलत समझा हो सकता है, अगर आप सिर्फ GetDate() ले जाने और इसे बदलना नहीं की कोशिश कर रहे आप एक के बाद खंड यानी

CREATE VIEW RecentRecordSum AS 
SELECT  t.ID, 
      SUM(t.SomeValue) AS ValueSum 
FROM  SomeTable t 
GROUP BY t.ID, t.RecordDate 
HAVING  t.RecordDate >= DATEADD(d,-7,GETDATE()) 
0

में मूल्यांकन कर सकते हैं अगर मैं मैं सही ढंग से प्रश्न को समझ रहा हूं, आप हमेशा निम्न क्वेरी में GETDATE() वाले एक सेट के साथ आंतरिक जुड़ने का प्रयास कर सकते हैं:

SELECT  t.ID, 
      SUM(t.SomeValue) AS ValueSum 
FROM  SomeTable t 
INNER JOIN (SELECT DATEADD(d,-7,GETDATE()) AS MIN_DATE) MIN_DATE_SET 
ON t.RecordDate >= MIN_DATE_SET.MIN_DATE 
GROUP BY t.ID 

संपादित करें: मैंने एक समान परिदृश्य के लिए एक क्वेरी योजना देखी है, और वे समान हैं। YMMV।

2

एक और शॉट, हर किसी की तरह ...

शायद आप इसे एक अनुक्रमित दृश्य बनाना चाहते हैं, जिसे आप getdate() के साथ नहीं कर पाएंगे, क्योंकि यह एक अनिश्चित कार्य है। मैं एक राय यह है कि सिर्फ

select getdate() 

अविवेक का यह स्तर SQL Server 2000 मूर्ख और मुझे schemabinding उपयोग करने की अनुमति के लिए पर्याप्त था शामिल भीतर से getdate() कॉल करके अतीत में इस उन्हें धोखा दिया है, लेकिन मैं इस गारंटी नहीं दे सकते बाद के संस्करणों के साथ काम करेंगे।

+0

मैं इसे एक-एक करके देखूंगा - धन्यवाद – geofftnz

+0

ने 2008 में इसका प्रयास किया। दुर्भाग्य से 'संदेश 4513, स्तर 16, राज्य 2, प्रक्रिया दृश्य_ProductSearch, रेखा 5 [बैच स्टार्ट लाइन 9] स्किमा बाइंड व्यू' डीबीओ नहीं कर सकता .view_ProductSearch '। 'dbo.view_CurrentDate' स्कीमा बाध्य नहीं है। –

+0

यह नहीं कि मैं इसकी अनुशंसा करता हूं, लेकिन आप एक सीएलआर फ़ंक्शन बना सकते हैं जो वर्तमान दिनांक लौटाता है और इसे IsDeterministic के रूप में चिह्नित करता है। – RedFilter

0

मानते हुए कि आप सबसे हाल ही में दिन के लिए वहाँ में डेटा हमारे पास है, एक सबक्वेरी शायद काम कर सकता था:

CREATE VIEW RecentRecordSum AS 
SELECT  t.ID, 
      SUM(t.SomeValue) AS ValueSum 
FROM  SomeTable t 
WHERE  t.RecordDate >= DATEADD(d,-7,(Select Max(RecordDate) From SomeTable)) 
GROUP BY t.ID 
संबंधित मुद्दे