首页 > 解决方案 > 指定时间段内程序中的 SQL 循环人数

问题描述

我不确定是否应该有一个循环或者最简单的方法是什么。

我的数据包含参与我们计划的人员列表。他们有不同的开始和结束日期,但以下等式能够捕捉到在特定日期参与的人数:

DECLARE @PopulationDate DATETIME = '2018-06-01 05:00:00';
select count(People) 
FROM Program_Log
WHERE 
START_TIME <= @PopulationDate
AND (END_TIME >= @PopulationDate OR END_TIME IS NULL)`

有没有一种方法可以循环输入不同的日期值来获取一整年每天的计划参与者数量?多年?

标签: sqlsql-servertsql

解决方案


一种简单的方法是使用 CTE 生成日期,然后使用 aleft 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)或类似的东西。


推荐阅读