关于管理受支持系统的停机时间,我希望能够从我的呼叫处理数据库中报告在受支持的小时内有多少停机时间。仅支持工作日9-5个小时。因此,如果一个系统在周五中午宕机,并在第二个星期二中午恢复,我需要记录16小时的宕机时间:周五5小时,12-58小时,周一8小时,周二9-12小时3小时。
理想情况下,我也想排除银行假日,但任何帮助都将不胜感激。谢谢。戴夫。
发布于 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),它包含所有的停机时间。
然后,所需的报告查询应如下所示:
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中,则会再次调整它们)。
https://stackoverflow.com/questions/15614056
复制相似问题