首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找停机时间的工作时间比例

查找停机时间的工作时间比例
EN

Stack Overflow用户
提问于 2013-03-25 19:41:48
回答 1查看 92关注 0票数 2

关于管理受支持系统的停机时间,我希望能够从我的呼叫处理数据库中报告在受支持的小时内有多少停机时间。仅支持工作日9-5个小时。因此,如果一个系统在周五中午宕机,并在第二个星期二中午恢复,我需要记录16小时的宕机时间:周五5小时,12-58小时,周一8小时,周二9-12小时3小时。

理想情况下,我也想排除银行假日,但任何帮助都将不胜感激。谢谢。戴夫。

EN

回答 1

Stack Overflow用户

发布于 2013-03-25 21:54:03

首先假设报告有2个参数@t1 DATETIME,@t2 DATETIME,其中@t1,@t2是要报告的期间的开始和结束时间。

我会创建一个包含所有支持时间段的表,例如,create table DATETIME (StartSupport DATETIME,EndSupport DATETIME)用于所有连续的支持时间段。(如果跨越几年,可能会包含很多行,但生成起来应该不会太困难)。

假设有一个类似的表CREATE table DATETIME (StartDownTime DATETIME,EndDownTime DATETIME),它包含所有的停机时间。

然后,所需的报告查询应如下所示:

代码语言:javascript
运行
复制
WITH CTE AS (
    SELECT
        CASE WHEN StartSupport < @t1 THEN @t1 ELSE StartSupport END AS StartSupport, 
        CASE WHEN EndSupport > @t2 THEN @t2 ELSE EndSupport END AS EndSupport
        FROM SupportTime
        WHERE @t1 <= EndSupport
        AND @t2 >= StartSupport)

SELECT
    SUM(
       DATEDIFF (mi,
       CASE WHEN dt.StartDownTime < CTE.StartSupport THEN CTE.StartSupport ELSE dt.StartDownTime END,
       CASE WHEN dt.EndDownTime > CTE.EndSupport THEN CTE.EndSupport ELSE dt.EndDownTime)
   ) As DownTimeMinutes, -- Total of down time during support time (mins)
FROM DownTime AS dt
INNER JOIN CTE ON (CTE.StartSupport <= dt.EndDownTime
                   AND CTE.EndSupport >= dt.StartDownTime)

SELECT SUM(DATEDIFF(mi, CTE.StartSupport, CTE.EndSupport)) AS SupportTimeMins

我将尝试解释这是怎么回事--如果开始报告时间或结束报告时间落在支持期限内,则虚拟CTE表包含报告日期之间的所有相关支持期限,并调整StartSupport或EndSupport。CTE与DownTime表的连接对所有相关记录的StartDownTime和EndDownTime之间的差值求和(如果StartDownTime和EndDownTime不在StartSupportTime或EndSupport中,则会再次调整它们)。

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

https://stackoverflow.com/questions/15614056

复制
相关文章

相似问题

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