计算mysql中事件之间的时差

时间:2015-07-23 13:32:27

标签: php mysql

假设我有一个具有以下结构的表:

MySQL Table Structure

如何为特定用户计算事件LOGINLOGOUT之间的时差?我希望获得每个用户拥有的会话时间的总和(因此,每个LOGINLOGOUT会话之间的时间总和)。我知道可以使用datediff,但我不确定语法以及如何将它与多个用户一起使用

最终出局将是:

+-------------+-------------------------+
| agent       | Total Session Time      |
+-------------+-------------------------+
| User - 194  | 00:30:00                |
| User - 195  | 00:40:00                |
+-------------+-------------------------+

1 个答案:

答案 0 :(得分:0)

我的版本仅输出上次注销和登录操作之间的差异:

select t1.agent, timediff(t2.lot, t1.lit) 
from (select agent, max(time) lit 
      from log where event = 'login' group by 1) as t1 
  join (select agent, max(time) lot 
        from log where event = 'logout' group by 1) as t2 
  on t1.agent = t2.agent 
group by 1;

我使用了下表定义:

CREATE TABLE `log` (
  `time` datetime DEFAULT NULL,
  `agent` varchar(50) DEFAULT NULL,
  `event` enum('login','logout') DEFAULT NULL
)

示例数据和输出

数据:

+---------------------+-------+--------+
| time                | agent | event  |
+---------------------+-------+--------+
| 2015-07-23 15:40:18 | u1    | login  |
| 2015-07-23 14:40:24 | u2    | login  |
| 2015-07-23 16:40:34 | u1    | logout |
| 2015-07-23 16:40:39 | u2    | logout |
| 2015-07-23 16:44:19 | u2    | login  |
| 2015-07-23 16:46:25 | u2    | logout |
+---------------------+-------+--------+

选择结果:

+-------+--------------------------+
| agent | timediff(t2.lot, t1.lit) |
+-------+--------------------------+
| u1    | 01:00:16                 |
| u2    | 00:02:06                 |
+-------+--------------------------+