mysql - 根据条件计算事件的总时间
问题描述
我有一张下表
CREATE TABLE log (
id INT NOT NULL AUTO_INCREMENT,
keyNo VARCHAR(16),
date DATE NOT NULL,
time TIME NOT NULL,
t1Event VARCHAR(255),
t2Event VARCHAR(255),
PRIMARY KEY (id)
)
我有以下方式的表格行
1 205 2018-07-10 12:01 Lclosed keyout
2 205 2018-07-10 12:02 Lclosed keyout
3 205 2018-07-10 12:03 Lclosed keyinside
4 205 2018-07-10 12:44 Lclosed keyout
5 205 2018-07-10 13:02 Lclosed keyinside
执行以下查询后得到的这张表
Select * from reportsuser where keyNo = '205' and date = '2018-07-10' and t1Event='Lclosed'
不,我想计算密钥出来的总时间,可以通过第一个keyout
事件和第一个事件keyinside
之后的第一个来计算keyout
。像这样我想通过总结所有这样的时间差来计算总时间,例如在上面我想要(3 - 1) + (5 - 4)
的情况下sno
。我怎样才能实现这个mysql查询?由于此类查询的时间段可能是月或年,因此最好的方法是什么?
解决方案
CREATE TABLE log (
id INT NOT NULL AUTO_INCREMENT,
dt DATETIME NOT NULL,
status VARCHAR(255),
PRIMARY KEY (id)
);
INSERT INTO log VALUES
(1, '2018-07-10 12:01:00' ,'keyout'),
(2, '2018-07-10 12:02:00' ,'keyout'),
(3, '2018-07-10 12:03:00' ,'keyinside'),
(4, '2018-07-10 12:44:00' ,'keyout'),
(5, '2018-07-10 13:02:00' ,'keyinside');
SELECT MIN(dt) dto
, dti
, SEC_TO_TIME(TIME_TO_SEC(dti)-TIME_TO_SEC(MIN(dt))) diff
FROM
( SELECT x.dt
, MIN(y.dt) dti
FROM log x
JOIN log y ON y.dt > x.dt
AND y.status = 'keyinside'
WHERE x.status = 'keyout'
GROUP
BY x.dt
) a
GROUP
BY dti;
+---------------------+---------------------+----------+
| dto | dti | diff |
+---------------------+---------------------+----------+
| 2018-07-10 12:01:00 | 2018-07-10 12:03:00 | 00:02:00 |
| 2018-07-10 12:44:00 | 2018-07-10 13:02:00 | 00:18:00 |
+---------------------+---------------------+----------+
推荐阅读
- rabbitmq - 用于消息代理的消息规范工具,如 RabbitMQ
- typescript - Kendo UI:自动完成自定义过滤事件
- javascript - 删除 HTML 元素
- ruby-on-rails - Rails 在 before_save 中将字符串转换为数组,但显示为字符串
- php - PHP:一键不带回它的价值
- python - 用于向地图添加点的 python 替代方案。开车兜风
- java - AlertDialog如何处理对话框视图之外的点击
- javascript - 王牌编辑器。在自动完成中添加说明选项卡
- android - Cordova 签名的 apk 在启动画面后产生空白屏幕
- c++ - 修复了带有引用的内存布局同步变量