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

计算实际停机时间而忽略日期/时间的重叠

牟焱
2023-03-14
问题内容

我正在尝试找出如何根据我存储在表中的数据来计算各种应用程序的实际停机时间。

目前,我只是在计算DowntimeMinutes中显示的DowntimeStart和DowntimeEnd之间的差异。

问题是,如果由于单独的组件故障而导致时间跨度,则应计入总数,而忽略重叠。

我的期望显示在“期望”列中。

关于如何将查询组合在一起以实现此目标的任何想法?

Application         DowntimeStart           DowntimeEnd              DowntimeMinutes    Expected
Application Demo    2014-11-20 17:31:01.467 2014-11-20 18:01:01.243  30                 30
Application Demo    2014-11-28 17:59:00.987 2014-11-28 18:09:02.167  10                 26
Application Demo    2014-11-28 18:00:01.403 2014-11-28 18:25:01.443  25                 0
Application Demo    2014-11-29 19:13:08.580 2014-11-30 05:30:01.763  617                617
Application Demo    2014-11-30 01:55:01.953 2014-11-30 03:54:01.730  119                0

我看了看并研究了这些选项,但它们没有达到上述目的:

查找忽略重叠的总分钟数(将基于光标的答案转换为CTE)

SQL查找多个重叠间隔中经过的时间

http://www.experts-exchange.com/Database/MS-SQL-
Server/SQL_Server_2008/Q_28169653.html

http://thehobt.blogspot.com.au/2009/04/calculating-elapsed-time-based-
upon.html

https://forums.teradata.com/forum/database/duration-calculation-between-
dates-which-has-overlap-with-other-date-ranges-for-
same


问题答案:

更新了新的测试案例

这是一种计算唯一中断的技术,然后将其与导致中断的初始停机时间对齐,以使实际值与预期值相匹配。

DECLARE @Downtime TABLE (
    ID INT PRIMARY KEY NOT NULL IDENTITY(1,1),
    Application VARCHAR(25), 
    DowntimeStart DATETIME,
    DowntimeEnd DATETIME,
    Expected INT
)

INSERT @Downtime (Application, DowntimeStart, DowntimeEnd, Expected) VALUES -- Act/Exp
    ('Application Demo', '2014-11-20 17:31:01.467', '2014-11-20 18:01:01.243', 30) -- 30/30
    ,('Application Demo', '2014-11-28 17:59:00.987', '2014-11-28 18:09:02.167', 26) -- 10/26
    ,('Application Demo', '2014-11-28 18:00:01.403', '2014-11-28 18:25:01.443', 0) -- 25/0
    ,('Application Demo', '2014-11-29 19:13:08.580', '2014-11-30 05:30:01.763', 617) -- 617/617
    ,('Application Demo', '2014-11-30 01:55:01.953', '2014-11-30 03:54:01.730', 0)
    ,('Application Demo 2', '2014-12-19 23:09:01.303', '2014-12-22 09:43:01.397', 3514)
    ,('Application Demo 2', '2014-12-19 23:09:01.303', '2014-12-22 09:43:01.397', 0)
    ,('Application Demo 2', '2014-12-19 23:09:01.303', '2014-12-22 09:43:01.397', 0) 
    ,('Application Demo 2', '2014-12-19 23:09:01.303', '2014-12-22 09:43:01.397', 0)
    ,('Application Demo 2', '2014-12-19 23:09:01.303', '2014-12-22 09:43:01.397', 0)

SELECT
    Downtimes.Application,
    Downtimes.DowntimeStart,
    Downtimes.DowntimeEnd,
    Downtimes.Expected,
    COALESCE(Actual, 0) AS Actual
FROM @Downtime Downtimes
    LEFT OUTER JOIN (
        SELECT DISTINCT
            D1.Application,
            MIN(CASE WHEN D1.DowntimeStart < D2.DowntimeStart THEN D1.ID ELSE D2.ID END) AS [ID],
            MIN(CASE WHEN D1.DowntimeStart < D2.DowntimeStart THEN D1.DowntimeStart ELSE D2.DowntimeStart END) AS [DowntimeStart],
            MAX(CASE WHEN D1.DowntimeEnd > D2.DowntimeEnd THEN D1.DowntimeEnd ELSE D2.DowntimeEnd END) AS [DowntimeEnd],
            DATEDIFF(MINUTE,
                MIN(CASE WHEN D1.DowntimeStart < D2.DowntimeStart THEN D1.DowntimeStart ELSE D2.DowntimeStart END),
                MAX(CASE WHEN D1.DowntimeEnd > D2.DowntimeEnd THEN D1.DowntimeEnd ELSE D2.DowntimeEnd END)) AS Actual
        FROM @Downtime D1
            INNER JOIN @Downtime D2
                ON D1.Application = D2.Application
                    AND (D1.DowntimeStart BETWEEN D2.DowntimeStart AND D2.DowntimeEnd
                        OR D2.DowntimeStart BETWEEN D1.DowntimeStart AND D1.DowntimeEnd)
        GROUP BY
            D1.Application,
            D1.DowntimeStart
    ) Outages
        ON Outages.ID = Downtimes.ID

这将产生所需的输出:

Application               DowntimeStart           DowntimeEnd             Expected    Actual
------------------------- ----------------------- ----------------------- ----------- -----------
Application Demo          2014-11-20 17:31:01.467 2014-11-20 18:01:01.243 30          30
Application Demo          2014-11-28 17:59:00.987 2014-11-28 18:09:02.167 26          26
Application Demo          2014-11-28 18:00:01.403 2014-11-28 18:25:01.443 0           0
Application Demo          2014-11-29 19:13:08.580 2014-11-30 05:30:01.763 617         617
Application Demo          2014-11-30 01:55:01.953 2014-11-30 03:54:01.730 0           0
Application Demo 2        2014-12-19 23:09:01.303 2014-12-22 09:43:01.397 3514        3514
Application Demo 2        2014-12-19 23:09:01.303 2014-12-22 09:43:01.397 0           0
Application Demo 2        2014-12-19 23:09:01.303 2014-12-22 09:43:01.397 0           0
Application Demo 2        2014-12-19 23:09:01.303 2014-12-22 09:43:01.397 0           0
Application Demo 2        2014-12-19 23:09:01.303 2014-12-22 09:43:01.397 0           0


 类似资料:
  • 问题内容: 我有一张表(在Oracle 9及更高版本中),在这里我需要使用Hibernate查找给定日期的所有条目。这些条目具有时间戳(数据类型为“ date”)。一些条目有一个时间,其他条目只有一个日期。这不能更改,因为这是我无法更改的其他应用程序的输出。在SQL中,我会按照 获取我想要的日期的所有条目。我想知道如何让Hibernate使用HQL做到这一点。我知道我可以在Hibernate中使用

  • 我需要帮助编写JPA查询(或函数)来删除搜索查询中的时间戳。 我可以通过两种方式使用Mysql查询。 选择*from table_name,其中日期(create_date)介于“2019-07-01”和“2019-07-31”之间 选择*from table_name,其中create_date介于“2019-07-01 00:00:00”和“2019-07-31 23:59:59”之间。 我可

  • 本文向大家介绍java计算两个日期中间的时间,包括了java计算两个日期中间的时间的使用技巧和注意事项,需要的朋友参考一下 java计算两个日期中间的时间 其中在数据库中有一个字段为datetime类型,想要计算两个日期之间过了多少天 多少小时 多少分钟。 思路为把时间换算为毫秒(与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。然后利用毫秒的加减计算。 计算如下:

  • 本文向大家介绍mysql日期和时间的间隔计算实例分析,包括了mysql日期和时间的间隔计算实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了mysql日期和时间的间隔计算。分享给大家供大家参考,具体如下: 我们首先得明确一点,mysql间隔值主要用于日期和时间计算,如果我们要要创建间隔值,可以使用以下表达式: 然后嘞,我们得了解,INTERVAL关键字是确定间隔值的expr,以及指定

  • 问题内容: 我想以小时/分钟/秒为单位计算两个日期之间的差异。 我的代码在这里有一个小问题: 这应该产生: 但是我得到这个结果: 有人可以在这里看到我在做什么错吗? 问题答案: 尝试 注意:这假定diff是非负数。

  • 1.日期时间的转换及赋值 1.1.date类型转换为字符串 justep.Date.toString(new Date(), justep.Date.STANDART_FORMAT_SHOT) 4种时间格式常量: justep.Date.DEFAULT_FORMAT 时间格式常量 = “yyyy/MM/dd hh:mm:ss” justep.Date.DEFAULT_FORMAT_SHOT 时