当前位置: 首页 > 面试题库 >

计算总时间(不包括重叠时间和SQLServer中的中断)

左丘曦
2023-03-14
问题内容

从选择查询的开始时间和结束时间列表中,我需要找出不包括重叠时间和休息时间的总时间。

StartTime                   EndTime
2014-10-01 10:30:00.000     2014-10-01 12:00:00.000 -- 90 mins
2014-10-01 10:40:00.000     2014-10-01 12:00:00.000 --0 since its overlapped with     previous
2014-10-01 10:42:00.000     2014-10-01 12:20:00.000 -- 20 mins excluding overlapped time
2014-10-01 10:40:00.000     2014-10-01 13:00:00.000 -- 40 mins
2014-10-01 10:44:00.000     2014-10-01 12:21:00.000 -- 0 previous ones have already covered this time range
2014-10-13 15:50:00.000     2014-10-13 16:00:00.000 -- 10 mins

因此,在这种情况下,总计应为160分钟。

我不想使用太多循环来解决这个问题。寻找一些简单的解决方案。


问题答案:
DECLARE @table TABLE (StartTime DateTime2, EndTime DateTime2)

INSERT INTO @table SELECT '2014-10-01 10:30:00.000', '2014-10-01 12:00:00.000'
INSERT INTO @table SELECT '2014-10-01 10:40:00.000', '2014-10-01 12:00:00.000'
INSERT INTO @table SELECT '2014-10-01 10:42:00.000', '2014-10-01 12:20:00.000'
INSERT INTO @table SELECT '2014-10-01 10:40:00.000', '2014-10-01 13:00:00.000'
INSERT INTO @table SELECT '2014-10-01 10:44:00.000', '2014-10-01 12:21:00.000'
INSERT INTO @table SELECT '2014-10-13 15:50:00.000', '2014-10-13 16:00:00.000'


;WITH addNR AS ( -- Add row numbers

    SELECT StartTime, EndTime, ROW_NUMBER() OVER (ORDER BY StartTime, EndTime) AS RowID
    FROM @table AS T

), createNewTable AS ( -- Recreate table according overlap time

    SELECT StartTime, EndTime, RowID 
    FROM addNR
    WHERE RowID = 1

    UNION ALL

    SELECT 
        CASE 
            WHEN a.StartTime <= AN.StartTime AND AN.StartTime <= a.EndTime THEN a.StartTime 
            ELSE AN.StartTime END AS StartTime, 
        CASE WHEN a.StartTime <= AN.EndTime AND AN.EndTime <= a.EndTime THEN a.EndTime 
            ELSE AN.EndTime END AS EndTime,
        AN.RowID 
    FROM addNR AS AN
    INNER JOIN createNewTable AS a
        ON a.RowID + 1 = AN.RowID

), getMinutes AS ( -- Get difference in minutes
    SELECT DATEDIFF(MINUTE,StartTime,MAX(EndTime)) AS diffMinutes
    FROM createNewTable
    GROUP BY StartTime
)
SELECT SUM(diffMinutes) AS Result
FROM getMinutes

结果是160



 类似资料:
  • 问题内容: 我有一个表,其中有两列开始时间和结束时间。我能够计算每一行的持续时间,但我也想获得总持续时间。这该怎么做。 谢谢 问题答案: 您的列的数据类型为TIMESTAMP,如下所示: 从一个时间戳减去另一个时间戳会导致一个INTERVAL数据类型: 并且不能对INTERVAL数据类型求和。这是一个令人讨厌的限制: 为了规避此限制,您可以使用秒数进行转换和计算,如下所示: 然后它们是可以累加的普

  • 问题内容: 我正在尝试找出如何根据我存储在表中的数据来计算各种应用程序的实际停机时间。 目前,我只是在计算DowntimeMinutes中显示的DowntimeStart和DowntimeEnd之间的差异。 问题是,如果由于单独的组件故障而导致时间跨度,则应计入总数,而忽略重叠。 我的期望显示在“期望”列中。 关于如何将查询组合在一起以实现此目标的任何想法? 我看了看并研究了这些选项,但它们没有达

  • 问题内容: 我有以下问题: 事件有一个“开始”和“结束”时间以及一个数量。我两者都使用MySQL DATETIME。 现在,如果我有一个约束条件说“没有重叠的事件”,我需要进行一些检查等,但是如何设计呢?用户只需要5分钟左右的精度,但是我想用几秒钟来进行计算,因为那是“更简单” /“更清洁” 如果我有一个事件(A),其起始端为“ YYYY-MM-DD 12:00:00”-“ YYYY-MM-DD

  • 问题内容: 我在一个MySQL数据库表上工作,该表的列包含我对其他主机执行ping操作时的时间戳记(例如2014-09-16 09:08:05)。我的问题是如何在几分钟内计算出针对特定主机的第一次ping和最后一次ping之间的差异?另外,如何为上述差异的开始和结束指定不同的时间戳(而不是第一次和最后一次ping)。这是表格的示例: 我希望我已经对自己的解释足够清楚。 问题答案: 您可以使用本机的

  • 我正试图在RoR上创建一个计算时间的应用程序。 当您按下开始按钮时,它会拉Time.now,然后,当您按下停止时,它会再次拉Time.now,然后计算两者之间的时间量。然后它会通过to_i将给定的秒转换为整数,然后将整数秒计算为小时:分钟:秒 然而,我的代码出了点问题,它不停地抛出一个又一个错误。 当前顺序为 nil:NilClass 的“未定义方法 '-'”

  • 我偶然发现了这个不错的教程https://github.com/manashmndl/DeadSimpleSpeechRecognizer其中数据是基于由文件夹分隔的样本进行训练的,所有mfcc都是一次计算的。 我正试图以不同的方式实现类似的目标。 基于此:https://librosa.github.io/librosa/generated/librosa.feature.mfcc.html l