SQL Serverデータベースにデータのセットがあり、マシンの稼働時間を計算する必要があります。稼働時間またはダウンタイムを決定するために2つの変数を使用しています。これらの2つの変数はとmachine_ON
ですfailure(s)
。machine_ON
はデータベース内の1つの変数のみであり、failure
64の異なる障害になる可能性がありますが、すべてがとして示されfx_x
ます。
これらの変数のステータス情報は、次のようにデータベースに保存されます。
timestamp failurebitNr timestampOutOfAlarm
2012-01-17 10:38:58.000 f1_14 2012-01-17 10:39:05.000
意味:障害はまでf1_14
アクティブでした2012-01-17 10:38:58.000
2012-01-17 10:39:05.000
また、machine_ON
状態は同じ方法で同じテーブルに保存されますfailurebitNr
が、値が異なる[ t2_13
]のみです。
したがって、稼働時間を決定するには、との間の時間差timestamp
から障害時間timestampOutOfAlarm
を差し引いたものを取得する必要があります。failurebutNr = 't2_13'
たとえば、データベースにこれらの行があります。
これにより、次のグラフィック表現が得られます。
緑は稼働時間、赤はダウンタイムです。
私はPHPで作業することに慣れており、whileループを使用していくつかの配列をファイルし、他のスクリプトを実行します。しかし今、私はこれをすべてSQLServerデータベースでクエリ方式で実行する必要があります...
では、アップタイム(緑)とダウンタイム(赤)をどのように計算できますか?
アップデート
マシンがオンになっている時間を秒単位で取得しようとしました。私はこのクエリを使用しました:
<!-- language: lang-sql -->
DECLARE @startDate datetime
DECLARE @endDate datetime
DECLARE @projectNr int
DECLARE @MachineNr nvarchar(10)
SET @startDate = '2012-01-01 00:00:00.000'
SET @endDate = '2012-02-01 00:00:00.000'
SET @projectNr = '1234567'
SET @MachineNr = '2'
SELECT
DATEDIFF("SECOND",
CASE WHEN timestamp < @startDate
THEN @startDate
ELSE timestamp
END,
CASE WHEN timestampOutOfAlarm > @endDate OR timestampOutOfAlarm IS NULL
THEN @endDate
ELSE timestampOutOfAlarm
END) AS Uptime
FROM
[table]
WHERE
timestamp < @endDate
AND (timestampOutOfAlarm > @startDate OR timestampOutOfAlarm IS NULL)
AND fileProjectNr = @projectNr
AND fileProjectMachineNr = @MachineNr
AND (failureBitNr = 't2_13' AND failureBitValue = '1')