mysql查询问题(总时间)

mdfafbf1  于 2021-06-17  发布在  Mysql
关注(0)|答案(8)|浏览(257)

我被卡住了。。我把加热器上的指示灯连到了树莓皮上。pi然后将随时间变化的状态(开和关)放入mysql数据库。在我使用php来表示数据之前,我现在正在尝试grafana。我不能让mysql查询呈现我想要的东西。
我需要知道加热器在指定的时间范围内(通常是最后24小时)被激活的时间(0/1)。我需要考虑到时间范围可能从“0”开始,这意味着加热器在这之前已经打开了。如果以“1”结尾也是一样的。也可能是一天中它被激活的百分比。
有人能帮我吗?我在找这样的结果
+-------+

piok6c0g

piok6c0g1#

要获取所需的数据,可以使用以下查询:
注:取决于 CURRDATE() 这些例子将失败。你可以用ofc。替换 CURDATE() 具有固定值,如 2018-11-27 ;
说明:
考虑到开/关紧随其后,查询将表与自身连接起来( L.id = R.id -1 )
查询正在选择任何结果,其中“on”或“off”是 today .
如果 on 是昨天,准时到了 00:00:00 今天: case when L.Time < CURDATE() then CURDATE() else L.Time end as onTime 如果最后一个条目是 on ,关闭时间“修正”为 00:00:00 明天: COALESCE(R.time, CURDATE() + Interval 1 day) (注:您可能需要 NOW() 而不是 CURDATE() + Interval 1 day ,到“现在”为止的当前秒数)
这两种方法用于计算运行秒数。
查询:

SELECT 
  L.playtime_id AS LID,
  R.playtime_id AS RID,
  case when L.Time < CURDATE() then CURDATE() else L.Time end as onTime,
  COALESCE(R.time, CURDATE() + Interval 1 day) AS offTime,
  (  
      UNIX_TIMESTAMP(COALESCE(R.time, CURDATE() + Interval 1 day)) -  
      UNIX_TIMESTAMP(case when L.Time < CURDATE() then CURDATE() else L.Time end)
  ) as RunningSeconds
FROM item0005 as L
LEFT JOIN item0005 AS R 
ON L.playtime_id = R.playtime_id -1

WHERE
  L.`value` = 1 AND
  (
    DATE(L.Time) = CURDATE() OR
    DATE (R.Time) = CURDATE()
  )
;

结果示例:

LID    RID     onTime                  offTime                 RunningSeconds
 2      3       2018-11-27T09:00:00Z    2018-11-27T11:26:24Z    8784
 4      5       2018-11-27T11:26:27Z    2018-11-27T11:28:29Z    122
 6      7       2018-11-27T11:29:39Z    2018-11-27T11:39:55Z    616
 8      (null)  2018-11-27T11:50:55Z    2018-11-28T00:00:00Z    43745

假设明天00:00:00的示例:http://sqlfiddle.com/#!公元前9/20年14/1
示例使用 NOW() 如果最后一个状态是 on : http://sqlfiddle.com/#!9/3c6227/1号
如果您只需要从中获得聚合,您可以使用另一个环境选择,并通过知道一天有86400秒来计算百分比:

SELECT
  SUM(RunningSeconds) AS RunningSeconds,
  SUM(RunningSeconds) / 86400 * 100 AS PercentageRunning
 FROM (
   ...
 ) as temp;

http://sqlfiddle.com/#!公元前9/20年14/5

uelo1irk

uelo1irk4#

----+
我已经准备好了:http://sqlfiddle.com/#!9/556364a号
谢谢!

3gtaxfhh

3gtaxfhh5#

----+
|值| secondsofday | percentofday|
+-------+

esyap4oy

esyap4oy6#

试试这个

SELECT VALUE, SUM(TIME_TO_SEC(TIMEDIFF(T2,T1))), 100*SUM(TIME_TO_SEC(TIMEDIFF(T2,T1)))/86400 FROM
(SELECT A.VALUE AS VALUE, COALESCE(B.TIME, TIMESTAMP(CURDATE()-2)) AS T1, A.TIME AS T2
FROM ITEM0005 A
LEFT JOIN ITEM0005 B
ON A.PLAYTIME_ID-1= B.PLAYTIME_ID
WHERE A.VALUE='0'
UNION
SELECT '1' AS VALUE, A.TIME AS T1, COALESCE(B.TIME, TIMESTAMP(CURDATE()-1)) AS T2
FROM ITEM0005 A
LEFT JOIN ITEM0005 B
ON A.PLAYTIME_ID= B.PLAYTIME_ID-1
WHERE A.VALUE='0') C
GROUP BY VALUE;
vlurs2pr

vlurs2pr7#

----+
| 0 | 28800 | 33.3 |
| 1 | 57600 | 66.6 |
+-------+

相关问题