首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算重叠时间范围内的分钟总和

计算重叠时间范围内的分钟总和
EN

Stack Overflow用户
提问于 2016-08-03 23:51:04
回答 3查看 1.7K关注 0票数 5

我需要计算术语的分钟总和。重叠的术语不应计算多次。

代码语言:javascript
复制
Declare @Terms table (Start DATETIME, Finish DATETIME)
INSERT INTO @Terms values
    ('2016-8-3 08:00','2016-8-3 09:00'),
    ('2016-8-3 09:00','2016-8-3 10:00'),
    ('2016-8-3 08:00','2016-8-3 09:30'),   -- overlapping term
    ('2016-8-3 11:00','2016-8-3 12:00')

上述数据的结果应该是180分钟(3小时)。最简单、最快的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-04 00:25:33

在交叉应用程序的帮助下。

代码语言:javascript
复制
Declare @Terms table (Start DATETIME, Finish DATETIME)
INSERT INTO @Terms values
    ('2016-8-3 08:00','2016-8-3 09:00'),
    ('2016-8-3 09:00','2016-8-3 10:00'),
    ('2016-8-3 08:00','2016-8-3 09:30'),   -- overlapping term
    ('2016-8-3 11:00','2016-8-3 12:00')

Select Minutes = sum(Minutes)
 From (
        Select Distinct 
               B.DateR1
              ,B.DateR2
              ,Minutes = DateDiff(Minute,B.DateR1,B.DateR2)
         From @Terms A
         Cross Apply (
                      Select DateR1=Min(Start)
                            ,DateR2=max(Finish) 
                       From  @Terms 
                       Where Start <= A.Finish and Finish >= A.Start
                     ) B
 ) A

返回

代码语言:javascript
复制
Minutes
180

子查询返回

代码语言:javascript
复制
DateR1                     DateR2                   Minutes
2016-08-03 08:00:00.000    2016-08-03 10:00:00.000  120
2016-08-03 11:00:00.000    2016-08-03 12:00:00.000  60
票数 7
EN

Stack Overflow用户

发布于 2016-08-04 00:19:17

您可以执行LEAD函数来查找重叠部分,该函数属于window语句。我创建了一个名为TIME_TEST的表,并插入了您的值,当我对它返回的三个小时的差值求和时。Lead Function Documentation

代码语言:javascript
复制
SELECT SUM(PREV_TIME - END_TIME) FROM (
SELECT *, LEAD(END_TIME) OVER(ORDER BY START_TIME) PREV_TIME
FROM TIME_TEST
ORDER BY 1
)FOO
;
票数 0
EN

Stack Overflow用户

发布于 2016-08-04 00:21:15

代码语言:javascript
复制
DECLARE @MAX as datetime;

SELECT @MAX = MAX(finish) FROM TERMS;

;WITH MINS AS (SELECT MIN(Start) N FROM TERMS
                UNION ALL
                SELECT dateadd(mi, 1, N) FROM MINS WHERE N < @MAX),
      OVERLAPMINS AS (
                        SELECT Mins.N from MINS 
                                            JOIN Terms T 
                                                    ON   T.Start <= MINS.N AND MINS.N < T.Finish 
                                                        GROUP BY Mins.N 
                                                            HAVING COUNT(0) > 1
                        )
      SELECT COUNT(0) totalmins FROM OVERLAPMINS 
option(maxrecursion 0)

除非我得到90分,如果重叠项不算多次,你怎么做到3小时?不过,您似乎已经计算了两次重叠。如果有第三个时间段在不同的时间与1和2个其他时间段重叠,该怎么办?您是说重叠的周期总是计数两次(这是可以的,因为任何重叠都会有>=2周期在任何一分钟内重叠),所以您可以将我的计数乘以2

代码语言:javascript
复制
...SELECT 2 * COUNT(0) totalmins..

如果想要将重叠计数为2,但不能超过2

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38748332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档