Możesz użyć tally:jest to rozwiązanie oparte na zbiorach, które działa lepiej niż rekurencja, gdy liczba iteracji wzrasta - i jest obsługiwane w widokach.
Oto podejście:
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
Zliczanie generuje wszystkie liczby z zakresu od 0 do 999 (możesz je łatwo rozszerzyć dodając cross join
s). Używamy go do „mnożenia” wierszy oryginalnej tabeli i generowania zakresu dat.
Próbowałem przepisać część, która obsługuje datę końcową. Rozumiem, że nie chcesz przyszłych dat, więc taki jest warunek w on
klauzula.
Dla tych przykładowych danych:
Identyfikator obiektu | Kwota | Data rozpoczęcia | data zakończenia -------:| -----:| :--------- | :--------- 1 | 500 | 2020-12-28 | brak 2 | 35 | 2019-09-26 | 2019-10-01 3 | 200 | 2020-05-28 | 2020-06-02
Zapytanie zwraca: