MySQL查询问题(总时间)

时间:2018-11-26 16:35:56

标签: mysql date time grafana

我被困住了。 我将加热器上的指示器连接到树莓派。然后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

谢谢!

2 个答案:

答案 0 :(得分:0)

尝试

box-sizing: border-box

答案 1 :(得分:0)

要获取所需的数据,可以使用以下查询:

注意:根据CURRDATE(),示例将失败。您可以。将CURDATE()替换为固定值,例如2018-11-27;

说明:

  • 考虑到开/关彼此跟随(L.id = R.id -1),查询正在将表与自身连接起来
  • 查询正在选择任何结果,其中“开”或“关”为today
  • 如果on是昨天,则将准时“校正”为今天的00:00:00case when L.Time < CURDATE() then CURDATE() else L.Time end as onTime
  • 如果最后一个条目是on,则将下班时间“校正”为明天的00:00:00COALESCE(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;

http://sqlfiddle.com/#!9/20bc14/5