У меня есть набор с данными в базе данных SQL Server, и мне нужно рассчитать время безотказной работы машины. Я использую две переменные для определения времени безотказной работы или простоев. Эти две переменные: machine_ON
и failure(s)
. machine_ON
- это только одна переменная в базе данных, failure
может быть 64 различных сбоя, но все указывает как fx_x
.SQL Server query buildup
Информация о состоянии этих переменных хранится в базе данных следующим образом:
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
].
Чтобы определить время безотказной работы, мне нужно получить timediff между timestamp
и timestampOutOfAlarm
, где failurebutNr = 't2_13'
минус любое время сбоя.
Так, например, у меня есть эти строки в моей базе данных:
Это должно дать следующее графическое представление:
Зеленый безотказной работы, красный простои.
Я привык работать с PHP, а не использовать цикл while и обрабатывать некоторые массивы и выполнять другие скрипты. Но теперь мне нужно сделать все это в базе данных SQL Server в запросах ...
Итак, как я могу вычислить время безотказной работы (зеленый) и время простоя (красный)?
UPDATE
Я пытался получить время в секундах, что машина включена. Я использовал этот запрос:
<!-- 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')
Запрос добавлен, чтобы получить время, когда машина включена. Теперь, как вычесть время сбоя ..? Поскольку одновременно может быть больше сбоев, как определить время отказа, только от начала до конца, независимо от количества сбоев. – Timo002
Думаю, я нашел решение для своей проблемы. Мне нужно разобраться с этим, и когда я уверен, что все в порядке, я опубликую его! – Timo002