如何使用重叠的开始和结束时间来总结15分钟间隔内发生的活动时间(SQL)(t-SQL)

威廉

我想编写一个查询,该查询将仅使用与活动开始和停止时间相对应的时间戳来计算一天中每个15分钟间隔内发生的活动总量。

这是一个示例数据集:

    DATE    StartDateTime   StopDateTime
2/2/2015    2/2/2015 7:00   2/2/2015 7:25
2/2/2015    2/2/2015 7:20   2/2/2015 7:29
2/2/2015    2/2/2015 7:35   2/2/2015 7:42
2/2/2015    2/2/2015 8:05   2/2/2015 8:14
2/2/2015    2/2/2015 8:16   2/2/2015 8:20
2/2/2015    2/2/2015 8:29   2/2/2015 8:40
2/2/2015    2/2/2015 8:55   2/2/2015 9:25

这就是我想要得到的:

    DATE    Interval       activityTime(min)
2/2/2015    2/2/2015 7:00   15
2/2/2015    2/2/2015 7:15   19
2/2/2015    2/2/2015 7:30   7
2/2/2015    2/2/2015 7:45   0
2/2/2015    2/2/2015 8:00   9
2/2/2015    2/2/2015 8:15   5
2/2/2015    2/2/2015 8:30   10
2/2/2015    2/2/2015 8:45   5
2/2/2015    2/2/2015 9:00   15
2/2/2015    2/2/2015 9:15   10

我一直在寻找一种以所需方式组织数据的方法,这是到目前为止我所能找到的最接近的方法,尽管我无法使其正常工作:

在T-SQL中将时间+持续时间分成间隔

我对SQL还是很陌生,所以对解决方案的任何解释将不胜感激。这也是我关于stackoverflow的第一篇文章,所以请让我知道数据是否不是首选格式,或者是否还有其他问题。谢谢!

哈宝

假设有一些合理的SQL Server最新版本,这应该是一个好的开始:

-- Some sample data.
declare @Samples as Table ( SampleId Int Identity, Start DateTime, Stop DateTime );
insert into @Samples ( Start, Stop ) values
  ( '2/2/2015 7:00', '2/2/2015 7:25' ),
  ( '2/2/2015 7:20', '2/2/2015 7:29' ),
  ( '2/2/2015 7:35', '2/2/2015 7:42' ),
  ( '2/2/2015 8:05', '2/2/2015 8:14' ),
  ( '2/2/2015 8:16', '2/2/2015 8:20' ),
  ( '2/2/2015 8:29', '2/2/2015 8:40' ),
  ( '2/2/2015 8:55', '2/2/2015 9:25' );
select * from @Samples;

-- Find the limits and align them to quarter hours.
declare @Min as DateTime;
declare @Max as DateTime;
select @Min = min( Start ), @Max = max( Stop )
  from @Samples;
set @Min = DateAdd( minute, -DatePart( minute, @Min ) % 15, @Min );
set @Max = DateAdd( minute, 15 - DatePart( minute, @Max ) % 15, @Max );
select @Min as [Min], @Max as [Max];


-- Go for it.
with QuarterHours ( QuarterStart, QuarterStop )
  as (
    select @Min, DateAdd( minute, 15, @Min )
    union all
    select QuarterStop, DateAdd( minute, 15, QuarterStop )
      from QuarterHours
      where QuarterStop < @Max ),
  Overlaps
  as ( select QH.QuarterStart, QH.QuarterStop, S.Start, S.Stop,
  case
    when S.Start <= QH.QuarterStart and S.Stop >= QH.QuarterStop then 15
    when S.Start <= QH.QuarterStart and S.Stop < QH.QuarterStop then DateDiff( minute, QH.QuarterStart, S.Stop )
    when S.Start > QH.QuarterStart and S.Stop >= QH.QuarterStop then DateDiff( minute, S.Start, QH.QuarterStop )
    when S.Start > QH.QuarterStart and S.Stop < QH.QuarterStop then DateDiff( minute, S.Start, S.Stop )
    else 0 end as Overlap
  from QuarterHours as QH left outer join
    @Samples as S on S.Start <= QH.QuarterStop and S.Stop >= QH.QuarterStart )
  select QuarterStart, sum( Overlap ) as [ActivityTime]
    from Overlaps
    group by QuarterStart
    order by QuarterStart;

您可以将最后一个更改selectselect * from QuarterHoursselect * from Overlaps以查看一些中间值。

解释性说明:

您可以使用所需的任何范围(@Min/ @Max),我只是从示例数据中获取了它们,以便示例可以运行。出于相同的原因,我使用了一个表变量,出于示例的缘故,无需创建“真实”表。

公用表表达式(CTE)通过递归创建QuarterHours覆盖所需范围的表(A号码表帐簿表也可以被用于产生四分之一小时)。然后,LEFT OUTER JOIN与所述采样数据被用于定位所有的Overlaps如果有的话,每个季度小时。这样可以保留没有活动的四分之一小时。

最后SELECT总结了结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用确切时间的 SQL 查询开始时间和结束时间

来自分类Dev

如何分别将时间列分为5分钟间隔和最大值/最小值SQL?

来自分类Dev

想要使用带有开始时间和结束时间的sql count在线人员

来自分类Dev

获取事务的开始和结束时间-SQL Server

来自分类Dev

获取SQL查询的开始/结束时间

来自分类Dev

如何在SQL中将5分钟的时间戳间隔转换为1分钟的间隔,同时保留其他信息?

来自分类Dev

SQL Need最小时间实例和彼此之间在10分钟内发生的事件列表的总持续时间

来自分类Dev

SQL 计算查询开始时间和持续时间以查找结束时间

来自分类Dev

如何选择与固定时间范围(B)重叠的时间范围(A),其中A的开始时间或结束时间超出SQL Server中B的范围

来自分类Dev

在SQL Server中将15分钟的时间序列转换为10分钟的时间序列

来自分类Dev

SQL 结束时间作为开始时间

来自分类Dev

具有开始时间和结束时间的SQL事件,转换为小时数

来自分类Dev

在Sql中获取开始时间和结束时间

来自分类Dev

按开始时间和结束时间合并SQL Server中的记录

来自分类Dev

如何通过自动开始日期和持续时间列来创建更新结束日期 SQL

来自分类Dev

sql查询根据开始和结束时间查找不同的条目

来自分类Dev

在mysql中的开始时间和结束时间之间获取30分钟的间隔数据

来自分类Dev

T-SQL寻找最简洁的方法来总结开始和结束日期范围

来自分类Dev

与前一条记录的时间间隔小于例如1分钟的ORACLE SQL查询记录

来自分类Dev

从开始和结束时间在PHP中分配20分钟的时间段

来自分类Dev

从开始和结束时间在PHP中分配20分钟的时间段

来自分类Dev

如何通过将持续时间添加到开始日期 SQL 来更新结束日期

来自分类Dev

Oracle SQL查询中的开始/结束日期和时间

来自分类Dev

根据结束日期和持续时间查找开始日期-T-SQL

来自分类Dev

根据结束日期和持续时间查找开始日期-T-SQL

来自分类Dev

如何在SQL Server中以5分钟间隔对datetime进行分区?

来自分类Dev

SQL中根据匹配的结束时间与开始时间组合顺序事件的最佳方法是什么?

来自分类Dev

将时间舍入到最近的5分钟SQL Server

来自分类Dev

在SQL Server中将时间字段分组为5分钟

Related 相关文章

  1. 1

    使用确切时间的 SQL 查询开始时间和结束时间

  2. 2

    如何分别将时间列分为5分钟间隔和最大值/最小值SQL?

  3. 3

    想要使用带有开始时间和结束时间的sql count在线人员

  4. 4

    获取事务的开始和结束时间-SQL Server

  5. 5

    获取SQL查询的开始/结束时间

  6. 6

    如何在SQL中将5分钟的时间戳间隔转换为1分钟的间隔,同时保留其他信息?

  7. 7

    SQL Need最小时间实例和彼此之间在10分钟内发生的事件列表的总持续时间

  8. 8

    SQL 计算查询开始时间和持续时间以查找结束时间

  9. 9

    如何选择与固定时间范围(B)重叠的时间范围(A),其中A的开始时间或结束时间超出SQL Server中B的范围

  10. 10

    在SQL Server中将15分钟的时间序列转换为10分钟的时间序列

  11. 11

    SQL 结束时间作为开始时间

  12. 12

    具有开始时间和结束时间的SQL事件,转换为小时数

  13. 13

    在Sql中获取开始时间和结束时间

  14. 14

    按开始时间和结束时间合并SQL Server中的记录

  15. 15

    如何通过自动开始日期和持续时间列来创建更新结束日期 SQL

  16. 16

    sql查询根据开始和结束时间查找不同的条目

  17. 17

    在mysql中的开始时间和结束时间之间获取30分钟的间隔数据

  18. 18

    T-SQL寻找最简洁的方法来总结开始和结束日期范围

  19. 19

    与前一条记录的时间间隔小于例如1分钟的ORACLE SQL查询记录

  20. 20

    从开始和结束时间在PHP中分配20分钟的时间段

  21. 21

    从开始和结束时间在PHP中分配20分钟的时间段

  22. 22

    如何通过将持续时间添加到开始日期 SQL 来更新结束日期

  23. 23

    Oracle SQL查询中的开始/结束日期和时间

  24. 24

    根据结束日期和持续时间查找开始日期-T-SQL

  25. 25

    根据结束日期和持续时间查找开始日期-T-SQL

  26. 26

    如何在SQL Server中以5分钟间隔对datetime进行分区?

  27. 27

    SQL中根据匹配的结束时间与开始时间组合顺序事件的最佳方法是什么?

  28. 28

    将时间舍入到最近的5分钟SQL Server

  29. 29

    在SQL Server中将时间字段分组为5分钟

热门标签

归档