如何考虑开始日期和结束日期按小时分组记录

时间:2019-09-29 13:05:43

标签: sql tsql sql-server-2008

我正在尝试根据时长对记录进行分组。假设有长时间运行的进程,并且在进程启动和完成时有日志数据。我试图按小时数获取正在运行的进程数的报告

数据看起来像这样

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

2 个答案:

答案 0 :(得分:0)

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

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;

为了获得合理的结果,它假定您正在查看的所有数据都是一天,就像您的示例数据一样。

答案 1 :(得分:0)

如果您加入了将一天中所有时间返回到表中的递归cte,则可以执行此操作:

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
.........................