1

我有两个领域:

  • 初始(时间戳)
  • 最终(时间戳)

我的查询是:

SELECT TIMEDIFF(Final, Initial) 
    AS 'Worked Hours' 
    FROM `db_foo`
    WHERE matriculation='X' AND date='2017-yy-yy'

结果将类似于

Worked Hours    
03:34:00
02:34:00
01:00:00
[...]

是否有可能进一步总结这些多个时间戳,以便获得总工作时间?

示例数据集(以 csv 格式导出):

DATE --- ID --- INITIAL --- FINAL --- MATRICULATION

2017-09-14,"29","2017-09-14 11:00:00","2017-09-14 14:34:00","4"
2017-09-14,"30","2017-09-14 17:00:00","2017-09-14 19:34:00","4"
2017-09-14,"31","2017-09-14 21:00:00","2017-09-14 22:00:00","4"

期望的输出(它是工作时间的总和):

Worked Hours
07:08:00

提前致谢

4

3 回答 3

3

TIME类型的最大值为838:59:59TIME如果您认为总和可能超过 838 小时,则对表达式求和是不安全的。我建议将时差转换为分钟,并将总小时数显示为十进制数,而不是时间:

SELECT
  ROUND(SUM(TIMESTAMPDIFF(MINUTE, Initial, Final) / 60.0), 1) AS "Worked Hours"
FROM `db_foo`
WHERE matriculation='X' AND date='2017-yy-yy';

这将返回

Worked Hours
7.1
于 2017-09-14T08:32:09.187 回答
2

要获得所需的结果,您可以使用以下查询

SELECT SEC_TO_TIME(
  SUM(
    TIMESTAMPDIFF(SECOND,Initial,Final)
  )
)
FROM `db_foo` /* WHERE clause*/; 

要获得总和以及先前的结果集,您可以遵循以下方法

SELECT t.*,SEC_TO_TIME(SUM(workedhours))
FROM (
  SELECT ID, TIMESTAMPDIFF(SECOND,Initial,Final)  workedhours
  FROM `db_foo`  /* WHERE clause*/
 ) t
GROUP BY ID WITH ROLLUP;

演示

于 2017-09-14T08:07:26.363 回答
0

试试这个

使用SEC_TO_TIMETIME_TO_SEC

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(Final, Initial))))
AS 'Worked Hours' 
FROM `db_foo`
WHERE matriculation='X' AND date='2017-yy-yy'

我希望它会帮助你。

于 2017-09-14T10:39:40.170 回答