有人可以帮助我吗,我通过将数据提取到 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
我不会为您编写整个查询,但我会尽可能彻底地回答您的问题,而无需为您完成所有工作。
时间差异
TIMEDIFF((返回 expr1 − expr2,表示为时间值。 expr1 和 expr2 是时间或日期和时间表达式,但两者的类型必须相同。
MySQL 文档
假设您可以对要计算的名称进行硬编码,并假设只有一个开始和结束时间,则查询可能如下所示。
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)
);
需要考虑的一些事项。
- 每个名字总是有一个开始时间,一个停止时间吗?
- 为什么这个解决方案比你目前实施的解决方案更好或更差?
- 如何使此查询适用于所有名称?
请记住,更有效的解决方案并不总是"正确"的解决方案。 您需要软件的效率如何? 有什么让你尝试优化这一点吗? 哪些解决方案更适合您的软件当前风格指南? 哪种解决方案更具可读性、可维护性等?