计算SQL中用户的时间段

时间:2015-02-27 14:35:03

标签: mysql

我有一个类似于:

的数据库表
ID  | User_ID   | User_State    | State_Datetime
---
1   | 1     | Login     | 2015-02-01 09:00:00
---
2   | 1     | Work      | 2015-02-01 09:05:00
---
3   | 1     | Break     | 2015-02-01 12:00:00
---
4   | 1     | Work      | 2015-02-01 13:10:00
---
5   | 1     | Logout    | 2015-02-01 18:00:00
---
6   | 2     | Login     | 2015-02-01 10:09:00
---
7   | 2     | Work      | 2015-02-01 10:50:00
---
8   | 2     | break     | 2015-02-01 13:10:00
---
9   | 2     | Work      | 2015-02-01 14:00:00
---
10  | 2     | Logout    | 2015-02-01 20:30:00
---

我想知道每个用户每次使用的休息时间工作时间总登录时间(注销 - 登录)天。休息时间是中断开始直到下一个User_State被分配,工作时间是工作开始直到下一个User_State被分配。

是否有任何单一查询可以帮助我获取此信息?

我需要结果:

 User_ID    | State | Date  | State_Time (HH:MM:SS) 
1   | Login | 2015-02-01    | 09:00:00 (this is logout time - login time)
1   | Work  | 2015-02-01    | 07:45:00 (this is time from work to break and work to logout etc)
1   | Break | 2015-02-01    | 01:10:00 (this is time from break to work)    
2   | Login | 2015-02-01    | 10:21:00 
2   | Work  | 2015-02-01    | 06:50:00  
2   | Break | 2015-02-01    | 00:50:00  

这就像员工数据库的办公时间以及工作和休息的细节。登录将是员工每天的第一个州,退出将是最后一个。休息状态可以在一天内多次出现,因此也是如此。

每个状态在标记新状态时结束。 因此,当标记WORK时,WORK开始;如果在WORK之后标记BREAK,则WORK结束并且BREAK开始;如果再次标记了工作,则BREAK结束并开始工作。理想情况下,LOGOUT后不应标记任何内容。

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT *, t.state_end 
FROM log_table 
LEFT JOIN (
SELECT id, 
    state_datetime END AS state_end,
    @prev_id  AS prev_id,
    @prev_id := id AS next_id
FROM
log_table
ORDER BY user_id, state_datetime
) as t
ON log_table.id = t.prev_id