Podría usar un conteo:esa es una solución basada en conjuntos, que funciona mejor que la recursividad cuando aumenta el número de iteraciones, y es compatible con las vistas.
Aquí hay un enfoque:
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
El conteo genera todos los números entre 0 y 999 (puede expandirlo fácilmente agregando cross join
s). Lo usamos para "multiplicar" las filas de la tabla original y generar el rango de fechas.
Intenté reescribir la parte que maneja la fecha de finalización. Entiendo que no desea fechas futuras, así que esa es la condición en on
cláusula sí.
Para estos datos de muestra:
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
La consulta devuelve:
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