我有一个类似于:
的数据库表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后不应标记任何内容。
答案 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