Рассчитать разницу времени на основе статуса (вкл / выкл) - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь рассчитать общее (ежедневное) время безотказной работы и общее время простоя в MySQL.Я получил следующую базу данных:

CREATE TABLE `IOT_DATA` (
  `DATA_ID` int(11) NOT NULL,
  `DATA_BRON` text NOT NULL,
  `DATA_SOORT` text NOT NULL,
  `DATA_WAARDE` int(11) NOT NULL,
  `DATA_TIJD` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `IOT_DATA` (`DATA_ID`, `DATA_BRON`, `DATA_SOORT`, `DATA_WAARDE`, `DATA_TIJD`) VALUES
(931, '77', 'temperature', 29, '2019-06-11 14:05:00'),
(932, '77', 'humidity', 32, '2019-06-11 14:05:00'),
(933, '77', 'temperature', 30, '2019-06-11 14:10:01'),
(934, '77', 'humidity', 32, '2019-06-11 14:10:01'),
(935, '77', 'temperature', 30, '2019-06-11 14:15:00'),
(936, '77', 'humidity', 31, '2019-06-11 14:15:00'),
(963, '77', 'status', 0, '2019-06-11 14:17:19'),
(978, '77', 'status', 1, '2019-06-11 14:18:40'),
(982, '77', 'temperature', 29, '2019-06-11 14:20:00'),
(983, '77', 'humidity', 32, '2019-06-11 14:20:00'),
(993, '77', 'status', 0, '2019-06-11 14:22:40'),
(1008, '77', 'status', 1, '2019-06-11 14:23:21'),
(1019, '77', 'status', 0, '2019-06-11 14:24:50'),
(1044, '77', 'temperature', 30, '2019-06-11 14:25:00'),
(1045, '77', 'humidity', 32, '2019-06-11 14:25:00'),

ALTER TABLE `IOT_DATA`
  ADD PRIMARY KEY (`DATA_ID`);

ALTER TABLE `IOT_DATA`
  MODIFY `DATA_ID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1070;

Сохраняет все данные датчика с машины.«Состояние» DATA_SOORT указывает, запущен ли компьютер (1) или остановлен (0).

У меня нет понятия, с чего начать, я искал сопоставимые темы и получил следующее:

select 
    date, 
    DATA_ID, 
    sum(datediff(minute, starttime, endtime )) downtime 
from (
    select 
       cast(t1.DATA_TIJD as date) as date, 
       t1.serviceid, 
       min(t1.DATA_TIJD) starttime, 
       ca.DATA_TIJD endtime
    from IOT_DATA t1
    cross apply (
       select top 1 DATA_TIJD
       from IOT_DATA
       where serviceid = t1.serviceid 
       and DATA_TIJD > t1.DATA_TIJD 
       and DATA_SOORT = "status"
       and DATA_WAARDE in (1) 
       order by DATA_TIJD
    ) ca
    where t1.DATA_ID in (0)
    group by cast(t1.DATA_TIJD as date), t1.DATA_ID, ca.DATA_TIJD
) a
group by date, DATA_ID;

Это не работает, и, честно говоря, понятия не имею, что это такое.Это дает следующую ошибку:

- Incorrect parameter count in the call to native function 'datediff'

Итак, я искал эту ошибку и получил что-то вроде этого, может обрабатывать только два выражения?Но я даже не уверен, что это правильный путь.

Ожидаемый результат должен быть примерно таким:

+------------+--------+----------+------------+--------------+
|    Date    | Source | TotaleUp | TotaleDown | PercentageUp |
+------------+--------+----------+------------+--------------+
| 11-06-2019 |     77 | 04:30:20 | 3:30:40    | 56%          |
| 12-06-2019 |     77 | 06:00:00 | 1:00:00    | 85%          |
+------------+--------+----------+------------+--------------+

Источник = DATA_BRON PercentageUP = Totaleup / (Totaleup + TotaleDown) * 100

Это моя первая тема, если что-нибудьотсутствует, пожалуйста, дайте мне знать

...