有人可以帮我解决这个问题,我是通过将数据提取到PHP数组来计算的,但我想知道是否可以通过Mysql查询来完成。
我想计算每个人的开始和结束操作之间的时间,他们可以有多个开始和结束操作。查询将计算每个人的工作小时数。
id | name | action | time
--- |-------------- | -------- | -------------------
1 | George | Start | 2017-01-12 11:23:22
2 | Moe | Start | 2017-01-12 11:20:22
3 | Moe | Making | 2017-01-12 11:22:20
4 | Moe | Making | 2017-01-12 11:22:48
5 | Moe | Running | 2017-01-12 11:23:12
6 | George | Idle | 2017-01-12 13:23:22
7 | Moe | End | 2017-02-23 14:33:23
8 | George | Idle | 2017-02-12 11:23:11
9 | George | Idle | 2017-03-12 11:23:14
10 | Moe | Start | 2017-02-24 10:23:18
11 | George | Proc | 2017-03-12 19:23:28
12 | George | Start | 2017-04-12 11:23:33
13 | Moe | Idle | 2017-02-27 17:23:33
14 | George | Runnig | 2017-04-13 11:23:45
15 | George | Idle | 2017-04-14 19:23:17
16 | George | End | 2017-05-18 09:23:19
17 | Moe | End | 2017-02-28 19:23:22
答案 0 :(得分:0)
我不会为你写完整个查询,但我会尽可能彻底地回答你的问题,而不会为你完成所有的工作。
TIMEDIFF()返回expr1 - 表示为时间值的expr2。 expr1和expr2是时间或日期和时间表达式,但两者必须属于同一类型。
假设您可以硬编码您正在计算的名称,并假设只有一个开始和结束时间,您的查询可能看起来像这样。
SELECT TIMEDIFF(
(SELECT `time` FROM ttime WHERE `name` = 'George' AND `action` = 'End' limit 1),
(SELECT `time` FROM ttime WHERE `name` = 'George' AND `action` = 'Start' limit 1)
);
需要考虑的一些事项。
请记住,更有效的解决方案并非始终是"正确的"解。您需要软件的效率如何?有什么东西让你试图优化这个吗?哪种解决方案更适合您的软件当前样式指南?哪种解决方案更易读,可维护等?