サポートされているシステムのダウンタイムの管理に関して、サポートされている時間内にどのくらいのダウンタイムが発生したかを通話処理データベースから報告できるようにしたいと考えています。サポートされている時間は、平日の 9 ~ 5 時間のみです。システムが金曜日の正午にダウンし、次の火曜日の正午に復旧した場合、16 時間のダウンタイムを記録する必要があります。
理想的には、銀行休業日も除外したいのですが、何か助けていただければ幸いです。ありがとう。デイブ。
サポートされているシステムのダウンタイムの管理に関して、サポートされている時間内にどのくらいのダウンタイムが発生したかを通話処理データベースから報告できるようにしたいと考えています。サポートされている時間は、平日の 9 ~ 5 時間のみです。システムが金曜日の正午にダウンし、次の火曜日の正午に復旧した場合、16 時間のダウンタイムを記録する必要があります。
理想的には、銀行休業日も除外したいのですが、何か助けていただければ幸いです。ありがとう。デイブ。
まず、レポートが @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 の外にある場合は再度調整されます)。