我被困住了。 我将加热器上的指示器连接到树莓派。然后pi将更改后的状态(打开和关闭)与时间一起放入mysql数据库。 在使用PHP展示数据之前,我现在尝试使用Grafana。而且我无法获取mysql查询来显示我想要的内容。
我需要知道在指定的时间范围内(通常是最后24小时)激活加热器的时间(0/1)。而且我需要考虑到时间范围可能以“ 0”开头,这意味着加热器一直处于该时间之前的时间。如果以“ 1”结尾,则相同。 也许还有当天被激活的百分比。
有人可以帮我吗? 我正在寻找这样的结果
+ ------- + -------------- + -------------- +
|价值| secondsOfDay | PercentOfDay |
+ ------- + -------------- + -------------- +
| 0 | 28800 | 33.3 |
| 1 | 57600 | 66.6 |
+ ------- + -------------- + -------------- +
我已经准备好了: http://sqlfiddle.com/#!9/556364a
谢谢!
答案 0 :(得分:0)
尝试
box-sizing: border-box
答案 1 :(得分:0)
要获取所需的数据,可以使用以下查询:
注意:根据CURRDATE()
,示例将失败。您可以。将CURDATE()
替换为固定值,例如2018-11-27
;
说明:
L.id = R.id -1
),查询正在将表与自身连接起来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/20bc14/1
如果最后一个状态为NOW()
,则使用on
来计数秒的示例:http://sqlfiddle.com/#!9/3c6227/1
如果您只需要聚合,则可以使用另一种“环境选择”,并通过知道一天有86400秒来计算百分比:
SELECT
SUM(RunningSeconds) AS RunningSeconds,
SUM(RunningSeconds) / 86400 * 100 AS PercentageRunning
FROM (
...
) as temp;