Php 用于计算两个时间戳之间断电的Mysql查询

Php 用于计算两个时间戳之间断电的Mysql查询,php,mysql,Php,Mysql,这是我问题的修订版本 我目前正在设计一个简单的电能质量监测工具。我已经设计了一个MySQL数据库,并用电压状态和在特定时间采取的相应时间戳填充该表。下面是我的表格结构 +----+---------------------+-------------+ | Id | Time_Stamp | Red_Ph_Volt | +----+---------------------+-------------+ | 1 | 2015-02-01 17:33:45 | 250

这是我问题的修订版本

我目前正在设计一个简单的电能质量监测工具。我已经设计了一个MySQL数据库,并用电压状态和在特定时间采取的相应时间戳填充该表。下面是我的表格结构

+----+---------------------+-------------+
| Id | Time_Stamp          | Red_Ph_Volt |
+----+---------------------+-------------+
|  1 | 2015-02-01 17:33:45 |      250.00 |
|  2 | 2015-02-01 18:53:41 |      250.00 |
|  3 | 2015-02-01 18:54:39 |       25.00 |
|  4 | 2015-02-01 18:54:54 |      242.00 |
|  5 | 2015-02-01 18:55:11 |      222.00 |
|  6 | 2015-02-02 21:00:29 |      250.00 |
|  7 | 2015-02-02 21:00:45 |      220.00 |
|  8 | 2015-02-02 21:00:55 |      230.00 |
|  9 | 2015-02-02 21:03:01 |      230.00 |
| 10 | 2015-02-02 21:03:36 |      250.00 |
| 11 | 2015-02-02 21:03:46 |       50.00 |
| 12 | 2015-02-06 17:54:08 |        0.00 |
| 13 | 2015-02-06 23:04:04 |      220.00 |
| 14 | 2015-02-06 23:04:34 |      220.00 |
| 15 | 2015-02-06 23:05:51 |      250.00 |
| 16 | 2015-02-08 16:04:44 |      220.00 |
| 17 | 2015-02-08 16:06:29 |      220.00 |
| 18 | 2015-02-09 09:04:12 |      220.00 |
| 19 | 2015-02-09 10:42:39 |      203.00 |
| 20 | 2015-02-09 19:34:43 |      203.00 |
| 21 | 2015-02-09 21:57:02 |      203.00 |
| 22 | 2015-02-10 09:47:08 |        0.00 |
| 23 | 2015-02-10 11:15:34 |      250.00 |
| 24 | 2015-02-10 11:48:14 |      250.00 |
| 25 | 2015-02-10 13:18:14 |      220.00 |
| 26 | 2015-02-10 18:59:52 |        0.00 |
| 27 | 2015-02-10 22:44:14 |      250.00 |
| 28 | 2015-02-10 22:47:10 |      212.00 |
| 29 | 2015-02-14 00:02:10 |      212.00 |
| 30 | 2015-02-14 00:28:57 |      242.00 |
| 31 | 2015-02-14 00:35:56 |       21.00 |
| 32 | 2015-02-16 12:11:47 |       21.00 |
+----+---------------------+-------------+
32 rows in set (0.02 sec)
低于50V的任何电压均视为断电。我想写一个查询,查询表中2015-02-01 17:33:45和2015-02-14 00:28:57之间的总停机时间

伙计们,请帮帮我,因为我真的不知道如何处理它。

这应该有用:

SELECT sum(timestampdiff(SECOND, Time_Stamp, (SELECT Time_Stamp
                                              FROM voltage AS V2
                                              WHERE V2.Id > V1.Id
                                              LIMIT 1))) AS T
FROM voltage AS V1
WHERE Red_Ph_Volt <= 50 AND Time_Stamp BETWEEN '2015-02-01 17:33:45' AND '2015-02-14 00:28:57';

我假设电压为50也被视为断电,我将表名指定为电压。

正确处理此类查询的第一步是将每一行与其前一行连接起来

   SELECT *
     FROM voltage AS V
LEFT JOIN voltage AS PRV_V ON (PRV_V.Id = V.Id-1)
现在,您只需保留其先前度量值低于50的行,并将它们的时间戳差异相加

   SELECT SUM(TIMESTAMPDIFF(SECOND, PRV_V.Time_Stamp,  V.Time_Stamp))
     FROM voltage AS V
LEFT JOIN voltage AS PRV_V ON (PRV_V.Id = V.Id-1)
    WHERE PRV_V.Red_Ph_Volt < 50
      AND V.Time_Stamp BETWEEN '2015-02-01 17:33:45' AND '2015-02-14 00:28:57'
编辑:如果您的数据没有自动增量ID,或者ID之间存在间隙,您仍然可以使用时间戳将您的测量与其以前的测量连接起来:

   SELECT *
     FROM voltage AS V
LEFT JOIN voltage AS PRV_V 
       ON (  PRV_V.Time_Stamp < V.Time_Stamp
             AND NOT EXISTS ( SELECT *  
                                FROM voltage 
                               WHERE Time_Stamp > PRV_V.Time_Stamp
                                 AND voltage.Time_Stamp < V.Time_Stamp
                            )
          )

在您的解决方案中,您假设连续行的ID总是相差1。如果表格被编辑,这可能不起作用。你是对的。虽然在大多数情况下,连接都会起作用,但我编辑了答案,添加了一个替代方法,仅使用时间戳将行与前一行连接起来。谢谢你们的帮助。你所有的回答都为我提供了一个我一直在寻找的解决方案。你们都是天才!!!结果会是怎样的?