2012-03-01 6 views
5

मेरे पास एक संग्रहित प्रक्रिया है जो डेटा खींचती है और तिथि पर पिछले वर्ष के डेटा में शामिल हो जाती है। समस्या यह है कि चालू वर्ष के आंकड़ों में शामिल होने के लिए कुछ भी नहीं है क्योंकि 2011 में 2 9 फरवरी नहीं था। क्या किसी और ने इस समस्या का अनुभव किया है? किसी के पास इस बारे में कोई विचार है कि इसके आसपास कैसे काम करना है?फरवरी 2 9 पिछले वर्ष की फरवरी 28 की तुलना में

यहाँ संग्रहीत प्रक्रिया है:

SELECT 
--b.Date_Rep AS Date_Rep, 
SUM(b.AccountsCreatedThisYear) AS AccountsCreatedThisYearTot, 
SUM(a.AccountsCreatedThisYear) AS AccountsCreatedLastYearTot, 

FROM Report2011.dbo.T_Report_01 b WITH (NOLOCK) --This year  
LEFT JOIN Report2011.dbo.T_Report_01 a WITH (NOLOCK) ON DATEADD(yyyy,-1,b.Date_Rep) = a.date_rep --Last year 
WHERE (a.Date_Rep BETWEEN DATEADD(year, -1,@StartDate) AND DATEADD(year, -1,@EndDate)) 
+0

क्यों 'वाम JOIN' जब' WHERE' खंड बनने के लिए यह बाध्य करेगा एक आंतरिक में शामिल होने? 'DATEADD' अमान्य तिथियां नहीं बना सकता है, तो क्या यह मुद्दा है कि यह * शामिल है, लेकिन" गलत "तिथि या क्या? –

+0

क्या यह सिर्फ पिछले साल के 1 मार्च से इसकी तुलना नहीं करेगा? – Greg

+1

@ जेबी। मैं जे कॉपर के साथ हूं - आप 28 साल से पिछले साल 28 वें साल की तुलना कर चुके हैं, इसलिए इस साल 2 9वीं से डेटा की तुलना करने की कोई तारीख नहीं है। – Filburt

उत्तर

0
declare @29Feb datetime = convert(datetime,'2012/02/29') 
    declare @28Feb datetime = convert(datetime,'2012/02/28') 

select case when 
      dateadd(yy,-1,@29Feb) = dateadd(yy,-1,@28Feb) 
      then 1 
      else 0 end 

यह चयन बयान आउटपुट 1, तो वास्तव में 29 फरवरी और फ़र, 28 दिनांक 28 फरवरी

पिछले एक साल में केवल एक ही इसी तिथि, राशि

अब आप अलग-अलग वर्षों में दो अवधि के लिए योग कर रहे हैं जिसके लिए ऐसा होता है कि पहली अवधि में वर्तमान अवधि की तुलना में 1 दिन कम है।
कैसे किसी को निम्नलिखित प्रश्न का जवाब होगा:

"How many accounts have been created in the last year's February and how many this year?" 

इससे कोई फर्क पड़ता है इस तथ्य एक फरवरी 28 दिन और अन्य 29 था? मुझे विश्वास नहीं है, संदर्भ फरवरी है, दिन नहीं।

  • पिछले साल में, इसी अवधि में, कुछ खातों था, इसलिए एक दिन इस साल जब कोई भी खाता नहीं बनाया गया है हो सकता है, लेकिन:

    तो मैं इस प्रश्न के साथ दो समस्याओं को देखने बाएं जुड़ाव पिछले वर्ष में

  • इस वर्ष के लिए दो अलग-अलग तिथियों के लिए, 28 और 2 9 केवल एक दिन से मेल खाता है, 28 इसलिए इसे दो बार सम्मिलित किया जाता है।


SELECT  (SUM(b.AccountsCreatedThisYear) 
    FROM Report2011.dbo.T_Report_01 WITH (NOLOCK) --This year 
    WHERE Date_Rep BETWEEN @StartDate and @EndDate) as AccountsCreatedThisYearTot, 

    (SUM(b.AccountsCreatedThisYear) 
    FROM Report2011.dbo.T_Report_01 WITH (NOLOCK) -- Last Year 
    WHERE Date_Rep BETWEEN DATEADD(year, -1,@StartDate) AND DATEADD(year, -1,@EndDate)) as AccountsCreatedLastYearTot 
1

एक FULL OUTER JOIN बजाय एक LEFT JOINCOALESCE की और प्रयोग उपयोग करके देखें:

SUM(COALESCE(b.AccountsCreatedThisYear, 0)) AS AccountsCreatedThisYearTot और SUM(COALESCE(a.AccountsCreatedThisYear, 0)) AS AccountsCreatedLastYearTot

तो आप से बचने के शून्य के जब तिथियां मेल नहीं खाती ।

4

स्टार्टर्स के लिए, मैं बाएं जुड़ने के बाहरी किनारे पर एक तालिका से कॉलम पर where खंड नहीं करता। ऐसा करें,:

SELECT SUM(b.AccountsCreatedThisYear) AS AccountsCreatedThisYearTot, 
     SUM(a.AccountsCreatedThisYear) AS AccountsCreatedLastYearTot, 
FROM Report2011.dbo.T_Report_01 b WITH (NOLOCK) --This year  
LEFT JOIN Report2011.dbo.T_Report_01 a WITH (NOLOCK) 
     ON DATEADD(yyyy,-1,b.Date_Rep) = a.date_rep --Last year 
WHERE b.Date_Rep BETWEEN @StartDate AND @EndDate 
+1

हां, वह अपने बाएं जुड़ने को एक आंतरिक जुड़ने में परिवर्तित कर रहा था। – HLGEM

0

कोई 29 फ़र, पिछले साल हुई थी लेकिन मार्च 1 था 365 दिन पहले और 28 फ़र, था 366 दिन पहले।

SELECT SUM(b.AccountsCreatedThisYear) AS AccountsCreatedThisYearTot, 
    SUM(a.AccountsCreatedThisYear) AS AccountsCreatedLastYearTot, 
FROM Report2011.dbo.T_Report_01 b WITH (NOLOCK) --This year  
LEFT JOIN Report2011.dbo.T_Report_01 a WITH (NOLOCK) 
    ON DATEADD(dd,-365,b.Date_Rep) = a.date_rep --Last year 
WHERE b.Date_Rep BETWEEN @StartDate AND @EndDate 

+1 मार्क बैनिस्टर के रूप में मैं अपने वाक्य रचना का इस्तेमाल किया

संबंधित मुद्दे