Mam uruchomiony serwer MySql na którym zapisuje się co się dzieje z ogrzewaniem w domu.
Jedna tabela "piec" przechowuje informację kiedy piec się uruchomił a kiedy wyłączył.
Zapis jest w postaci:
Id / wartość / data
1 / 1 / 2019-11-01 02:30:00 - informacja o włączeniu się pieca
2 / 0 / 2019-11-01 02:53:00 - informacja o wyłączeniu się pieca
3 / 0 / 2019-11-01 03:01:00 - piec nadal wyłączony
4 / 1 / 2019-11-01 03:08:00 - uruchomienie pieca
5 / 1 / 2019-11-01 03:09:00 - piec nadal pracuje
....
itd
czasami system wysyła kontrolne ramki tak że w ciągu jednego cyklu grzania pojawiają się w tablicy 2-3 wpisy pod rząd z informacją że piec pracuje. tak samo kiedy piec jest wyłączony.
Chciałem stworzyć zapytanie, które będzie mi liczyło czas pracy pieca w danym dniu - czyli sumowało wszystkie czasy od 1 do 0, ale nie wiem czy jest to możliwe do wykonania w jednym zapytaniu. Zastanawiam się czy np nie prościej by było np przy zapisywaniu 0 do tablicy sprawdzać czy ostatni wpis to 1, zliczać różnicę w czasie i zapisywać wynik do innej tabeli. No ale to rozwiązanie też nie jest bez wad...
Może ktoś już starał się rozwiązać podobny problem.
Z góry dzięki za rady.
Trzymaj:
CREATE TABLE `piec` ( `id` int(11) NOT NULL AUTO_INCREMENT, `wartosc` tinyint(4) DEFAULT NULL, `data` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id_UNIQUE` (`id`) ) ENGINE=InnoDB; INSERT INTO `piec` VALUES (1,0,'2019-01-01 01:00:00'), (2,1,'2019-01-01 02:00:00'), (3,1,'2019-01-01 03:30:00'), (4,1,'2019-01-01 04:00:00'), (5,0,'2019-01-01 05:00:00'), (6,1,'2019-01-01 06:00:00'), (7,0,'2019-01-01 07:00:00'), (8,1,'2019-01-02 01:00:00'), (9,0,'2019-01-02 02:00:00'), (10,0,'2019-01-02 03:00:00'), (11,1,'2019-01-02 04:00:00'), (12,0,'2019-01-02 05:00:00'), (13,1,'2019-01-02 06:00:00');
SET @dzien:='2019-01-02'; SET @i1:=0; SET @i2:=0; SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(data1, data2)))) AS 'Laczny czas' FROM (SELECT @i1:=@i1+1 AS id1, p1.DATA AS data1, p2.wartosc - p1.wartosc AS zmiana1 FROM piec AS p1 INNER JOIN piec AS p2 ON p1.id = (p2.id + 1) WHERE (p2.wartosc <> p1.wartosc) AND DATE (p1.DATA) = @dzien ) AS tab1 INNER JOIN (SELECT @i2:=@i2+1 AS id2, p3.DATA AS data2, (p4.wartosc - p3.wartosc) AS zmiana2 FROM piec AS p3 INNER JOIN piec AS p4 ON p3.id = (p4.id + 1) WHERE (p3.wartosc <> p4.wartosc) AND DATE(p3.DATA) = @dzien) AS tab2 ON tab1.id1 = tab2.id2 + 1 WHERE `zmiana1` = 1
Na danych autora otrzymałem NULL.
Utrudnieniem będzie przełom dnia kiedy była zachowana ciągłość pracy pieca. Wydaje mi się, że lepszym rozwiązaniem będzie tu użycie skryptu.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)