MySql计算小时数查询

时间:2017-08-21 16:46:03

标签: mysql

有人可以帮我解决这个问题,我是通过将数据提取到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

1 个答案:

答案 0 :(得分:0)

我不会为你写完整个查询,但我会尽可能彻底地回答你的问题,而不会为你完成所有的工作。

TIMEDIFF

  

TIMEDIFF()返回expr1 - 表示为时间值的expr2。 expr1和expr2是时间或日期和时间表达式,但两者必须属于同一类型。

     

MySQL Documentation

假设您可以硬编码您正在计算的名称,并假设只有一个开始和结束时间,您的查询可能看起来像这样。

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)
);

需要考虑的一些事项。

  1. 每个名字总是有一个开始和一个停止时间吗?
  2. 为什么这个解决方案比你今年实施的解决方案更好或更差?
  3. 您如何使此查询适用于所有名称?
  4. 请记住,更有效的解决方案并非始终是"正确的"解。您需要软件的效率如何?有什么东西让你试图优化这个吗?哪种解决方案更适合您的软件当前样式指南?哪种解决方案更易读,可维护等?