2

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

理想情况下,我也想排除银行假期,但我们将不胜感激。谢谢。戴夫。

4

1 回答 1

0

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

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

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

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

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 表的 JOIN 汇总了所有相关记录的 StartDownTime 和 EndDownTime 之间的差异(如果 StartDownTime 和 EndDownTime 超出 StartSupportTime 或 EndSupport,则再次调整)。

于 2013-03-25T13:54:02.580 回答