1

我有一张表格,其中包含设备开启和关闭的日期/时间列表。这是举行的:

date-time   |  equipment id  | state (1 or 0)

我正在尝试创建一个时间线,以显示设备何时运行的时间线或条形图,当它打开时,什么都没有。我没有使用 SQL 的经验,所以我不知道如何处理这个问题。我可以尝试使用下一次状态更改的开始来创建结束日期/时间,但我不确定这在 MySQL 中是否可行。我曾尝试仅使用查询列表在 excel 中执行此操作,但它仅绘制为单个日期/时间点。我想我需要某种持续时间。我不知道如何进行。任何建议或指示将不胜感激。

4

1 回答 1

1
CREATE TABLE `status` (
  `id` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `state` int(11) DEFAULT NULL
)


set @last_date = NULL;
select @last_date as start_date,
  date as end_date,
  case when state = 1 then @last_date := date end as ignore_me,
  case when state = 0 then (unix_timestamp(date) - unix_timestamp(@last_date)) / 60 end as duration
from status
where id = 1
order by date

给你这样的输出:

+---------------------+---------------------+---------------------+----------+
| start_date          | end_date            | ignore_me           | duration |
+---------------------+---------------------+---------------------+----------+
| 2012-11-20 01:16:00 | 2012-11-20 01:00:00 | 2012-11-20 01:00:00 |     NULL |
| 2012-11-20 01:00:00 | 2012-11-20 01:15:00 | NULL                |  15.0000 |
| 2012-11-20 01:00:00 | 2012-11-20 01:16:00 | 2012-11-20 01:16:00 |     NULL |
| 2012-11-20 01:16:00 | 2012-11-20 01:20:00 | NULL                |   4.0000 |
+---------------------+---------------------+---------------------+----------+

只取具有持续时间的行来表现出色:

select * from (
  ...
) foo
where duration is not null

+---------------------+---------------------+-----------+----------+
| start_date          | end_date            | ignore_me | duration |
+---------------------+---------------------+-----------+----------+
| 2012-11-20 01:00:00 | 2012-11-20 01:15:00 | NULL      |  15.0000 |
| 2012-11-20 01:16:00 | 2012-11-20 01:20:00 | NULL      |   4.0000 |
+---------------------+---------------------+-----------+----------+
于 2012-11-20T19:31:37.873 回答