SQL Server : CTE Months between dateranges -


मेरे पास निम्न संरचना के साथ एक तालिका है:

  प्रारंभ तिथि डाटैटेम नल एंडेड डेटैट टाइम नॉट शून्य EnrollmentId nvarchar (255) नहीं nULL ProgrammeId nvarchar (255) रिक्त नहीं   

<कोड> EnrollmentId प्राथमिक कुंजी है, और एक GUID स्ट्रिंग की तरह एक सा है, और < कोड> प्रोग्राम आईआईडी एक 'विषय कोड' को संदर्भित करता है जो GUID की तरह कुछ भी होता है।

मुझे क्या करना है, यह निर्धारित करता है कि महीनों की एक निश्चित संख्या प्रोग्राम है सभी नामांकन के लिए एक विशिष्ट तिथि सीमा के दौरान अर्जित किया 01/01/2011 से 1 अप्रैल 2014 तक। तो हम कहते हैं कि मेरे पास एक नामांकन है जो 08/08/2010 से 01/01/2012 <बीच में मौजूद है < / Code> एक विशेष प्रोग्राम आईआईडी के लिए। मुझे 01/01/2011 के बाद अर्जित किए गए सभी महीनों की गिनती करना होगा। इसलिए इस तारीख से पहले किसी भी महीने की गिनती नहीं होनी चाहिए i.e. 08/08/2010 से 31/12/2010 को गिना नहीं जाना चाहिए।

आदर्श रूप से मुझे एक निश्चित तारीख सीमा के लिए कितने महीने प्रति प्रोग्राम आईडी की गिनती चाहिए।

बस कुछ नोट्स: < Ol>

  • मुझे पूरा महीनों की गिनती की आवश्यकता होगी ताकि यदि कोई नामांकन 08/01/2011 से शुरू हो और 20/01/2012 को खत्म हो जाए तो केवल 12 महीने ही विचार करना चाहिए।
  • उस अवधि में महीनों की गणना करना आम तौर पर संबंधित महीने अर्थात 1 जनवरी 2011 से 1 अप्रैल 2014, 1 मई 2014 आदि आदि की शुरुआत में है।

    कुछ महीनों के लिए सभी महीने लौटने के लिए एक नामांकन: MonthList के रूप में (DATEADD का चयन करें (महीना, एम, '12 / 1/18 99 ') को' फर्स्टडे 'के रूप में, डेटएड (दिन, -1, डेटएड (महीना, एम) के साथ एक नामांकन:

      (1, '12 / 1/18 99 '))' लास्टडे 'के रूप में, DATEADD (महीना, एम + 1, '12 / 1/18 99') से 'फर्स्टडेडेक्स्टमाँथ' से (शीर्ष 3000 ROW_NUMBER () का चयन करें .name) मास्टर से 'एम' के रूप में) एसपी_आईएलएड्स एस) एस) टी। प्रोग्राममैडी, एमएल। फर्स्टडे, एमएल। लिस्ट डे नामांकन से लेकर टीआरटीडीट एंड लेफ्टिनेंट पर महीनेलिस्ट एमएल में शामिल हों; ml.FirstDayNextMonth और t.enddate & gt; = ml.FirstDay   

    अग्रिम धन्यवाद

    1. आपको पूर्ण महीने पाने के लिए फ़ंक्शन की तरह फ़ंक्शन की आवश्यकता हो सकती है।
    2. मान लें कि आपके पास कुछ ऐसा है जो मैं सुनिश्चित करता हूं कि आप श्रेणी में हैं और चिप आरंभ और अंत में एक सीटीई में सीमा तय करने के लिए जैसा कि आप सुझाव देते हैं 3. समूहीकरण और संक्षेप करना आसान है।

      कुछ नमूना डेटा सेट करें:

        बनाएँ तालिका # tbl (नामांकन INT INT नहीं है - नोट: का उपयोग कर INT बजाय अपने VARCHAR की becuas eit आसान और नमूने में कोई फर्क नहीं पड़ता, ProgrammeId INT नहीं NULL, StartDate DATETIME नहीं NULL ENDDATE को DATETIME नहीं NULL) #tbl मूल्यों (1,1 में, सम्मिलित करें '2013-01-01', ' 2014-01-01 '), (2,1,' 2013-07-01 ',' 2014-01-01 '), (3, 2,' 2013-01-01 ',' 2014-01-01 ' (4,3, '2013-01-15', '2014-03-01')   

      अब खोज रेंज घोषित करें और क्वेरी करें

       < कोड> घोषणा @RangeStart DATETIME = '2013-01-01' @RangeEnd DATETIME = '2013-12-01' बखान भी CTE के साथ (चयन EnrollmentId, ProgrammeId, मामला है जब @RangeStart & gt; = StartDate तो @RangeStart वरना StartDate अंत EffectStartDate, मामला है जब @RangeEnd & lt; = EndDate तो और EndDate अंत EffectEndDate #tbl कहां बीच StartDate और EndDate --start तारीख @RangeStart रेंज या StartDate और EndDate --या अंत की तारीख के बीच @RangeEnd में है से @RangeEnd सीमा में है या (समाप्ति & gt; @ रेंज एंड एंड स्टार्ट डेट & lt; @RangeStart) --या अवधि रेंज शामिल हैं) का चयन करें ProgrammeId, SUM (dbo.FullMonthsSeparation (EffectStartDate, EffectEndDate)) CTE ग्रुप द्वारा ProgrammeId   

      नमूना से परिणामों से महीने: <प्री> प्रोग्राममेड महीने ----------- ----------- 1 16 2 11 3 10

  • Comments

    Popular posts from this blog

    c - Mpirun hangs when mpi send and recieve is put in a loop -

    python - Apply coupon to a customer's subscription based on non-stripe related actions on the site -

    java - Unable to get JDBC connection in Spring application to MySQL -