Один простой способ - использовать CTE для генерации дат, а затем left join
для ввода данных. Например, следующее получает число по состоянию на первое число месяца в этом году:
with dates as (
select cast('2018-01-01' as date) as dte
union all
select dateadd(month, 1, dte)
from dates
where dte < getdate()
)
select d.dte, count(pl.people)
from dates d left join
program_log pl
on pl.start_time <= d.dte and (pl.end_time >= d.dte or pl.end_time is null)
group by d.dte
order by d.dte;
Обратите внимание, что это будет работать лучше всего для нескольких дат. Если вам нужно больше 100, вам нужно добавить option (maxrecursion 0)
в конец запроса.
Также, count(people)
крайне подозрительно. Возможно, вы имеете в виду sum(people)
или что-то подобное.