आप एक टैली का उपयोग कर सकते हैं:यह एक सेट-आधारित समाधान है, जो पुनरावृत्तियों की संख्या बढ़ने पर रिकर्सन से बेहतर प्रदर्शन करता है - और यह विचारों में समर्थित है।
यहाँ एक दृष्टिकोण है:
select t.objectid, t.amount, dateadd(day, x.n, t.begindate) as dt
from (
select row_number() over (order by (select null)) - 1
from (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
) x(n)
inner join tabledatarange t
on dateadd(day, x.n, t.begindate) <= case
when enddate <= convert(date, getdate()) then enddate
else convert(date, getdate())
end
टैली 0 और 999 के बीच सभी संख्याएँ उत्पन्न करती है (आप cross join
जोड़कर आसानी से इसका विस्तार कर सकते हैं एस)। हम इसका उपयोग मूल तालिका की पंक्तियों को "गुणा" करने और दिनांक सीमा उत्पन्न करने के लिए करते हैं।
मैंने उस हिस्से को फिर से लिखने का प्रयास किया जो अंतिम तिथि को संभालता है। मैं समझता हूं कि आपको भविष्य की तारीखें नहीं चाहिए, इसलिए on
. में यही शर्त है खंड करता है।
इस नमूना डेटा के लिए:
ObjectId | Amount | beginDate | endDate -------: | -----: | :--------- | :--------- 1 | 500 | 2020-12-28 | null 2 | 35 | 2019-09-26 | 2019-10-01 3 | 200 | 2020-05-28 | 2020-06-02
क्वेरी वापस आती है:
objectid | amount | dt -------: | -----: | :--------- 1 | 500 | 2020-12-28 1 | 500 | 2020-12-29 1 | 500 | 2020-12-30 1 | 500 | 2020-12-31 2 | 35 | 2019-09-26 2 | 35 | 2019-09-27 2 | 35 | 2019-09-28 2 | 35 | 2019-09-29 2 | 35 | 2019-09-30 2 | 35 | 2019-10-01 3 | 200 | 2020-05-28 3 | 200 | 2020-05-29 3 | 200 | 2020-05-30 3 | 200 | 2020-05-31 3 | 200 | 2020-06-01 3 | 200 | 2020-06-02