如何根据开始日期和结束日期按小时对记录进行分组

How to group records by hours considering start date and end date

我试图在考虑持续时间的情况下按小时对记录进行分组。假设有很长的 运行 个进程,并且在进程启动和完成时有日志数据。我正在尝试按小时获取报告有多少进程 运行

数据是这样的

Process_name      Start                End

'A'              '2019/01/01 14:10'   '2019/01/01/ 14:55'
'B'              '2019/01/01 14:20'   '2019/01/01/ 16:30'
'C'              '2019/01/01 15:05'   '2019/01/01/ 15:10'

结果应该是这样的

Hour    ProcessQount
14      2
15      2
16      1

生成小时数,然后使用不等式和聚合:

select h, count(t.process_name)
from (values (14), (15), (16)) v(h) left join
     t
     on datepart(hour, start <= v.h) and
        datepart(hour, end >= v.h)
group by v.h
order by v.h;

为了获得合理的结果,这假设您正在查看的所有数据都是一天的数据,就像您的样本数据中一样。

如果你加入一个递归 cte 就可以做到这一点,returns 一天中的所有时间到 table:

with cte as (
  select 0 as hour
  union all
  select hour + 1 
  from cte 
  where hour < 23 
)
select c.hour Hour, count(*) ProcessQount 
from cte c inner join tablename t
on c.hour between datepart(hh, t.[Start]) and datepart(hh, t.[End])
group by c.hour

参见demo
结果:

> Hour | ProcessQount
> ---: | -----------:
>   14 |            2
>   15 |            2
>   16 |            1

如果您更改为 LEFT JOINcount([Process_name]),那么您会得到一天中所有时间的结果:

> Hour | ProcessQount
.........................
>   12 |            0
>   13 |            0
>   14 |            2
>   15 |            2
>   16 |            1
>   17 |            0
>   18 |            0
.........................