3
id 标题 开始 结束
1 为这个项目做编码。2013-04-02 02:00:00 2013-04-02 04:00:00
2 为这个项目做编码。2013-04-02 04:00:00 2013-04-02 06:00:00
3 为这个项目做编码。2013-04-02 06:00:00 2013-04-02 06:30:00

我有上面的MySQL数据库表记录。现在我想得到总数hours.

我正在开发TimeSheet Management Application我们需要用员工的分钟和秒来显示总工作时间。(即根据我分享的数据04:30:00)

我试过什么?

SELECT HOUR(TIMEDIFF(end,start)) AS 'totalHour'但仅适用于每一行而不是所有记录。

我也试过了TIMESTAMPDIFF

这可能吗?

编辑

从我从人们那里得到的答案中,我已经尝试过他们中的每一个,但每次我只是得到4或者4.5000但它应该返回06:30:00

4

6 回答 6

4

HOUR()函数的范围是0 to 23这样的,所以在 diff 中使用它的总小时数是不正确的。

对于单个值,您可以使用TIMESTAMPDIFF()如下:

SELECT TIMESTAMPDIFF(HOUR, start, end) AS `totalHour` FROM ...

如果你想为整个项目计算它,你必须总结所有的时间差异,然后他们打印它可能用函数格式化,比如TIME_FORMAT()打印大于 24 的小时:

如果时间值包含大于 23 的小时部分,则 %H 和 %k 小时格式说明符会生成一个大于通常范围 0..23 的值。其他小时格式说明符产生模 12 的小时值。

所以你可以使用:

 SELECT TIME_FORMAT( SEC_TO_TIME( SUM( TIME_TO_SEC(end) - TIME_TO_SEC(start))), "%H")
            AS `totalHour`
 FROM ...
 GROUP BY sort_of_project_id

如果您也需要秒/分钟(如评论中所建议),请使用:

  • time_to_sec( <left side of select>)/3600 这将返回值4.84 hours
  • TIME_FORMAT( ..., "%H:%m:%s")这将显示4:38:24
于 2013-04-02T12:11:03.500 回答
2

试试这个查询

SELECT
 id, 
 title, 
 TIME_FORMAT(SEC_TO_TIME(sum(TIME_TO_SEC(TIMEDIFF( end, start)))), "%h:%i") AS diff
FROM 
 tbl1
GROUP BY  
 title

根据你给出的数据,答案应该是4:30。请交叉检查你的记录。

小提琴

于 2013-04-02T12:43:42.253 回答
1

像这样尝试,它会给你总小时数:

例如:

SELECT sum(time_to_sec(timediff(end, start ))/ 3600) AS 'totalHour' from test;

如果您对给定的上表运行此查询,它会显示输出4.5小时数。

希望它会帮助你。

于 2013-04-02T12:17:24.633 回答
1

我已经在其他线程中回答了https://stackoverflow.com/questions/44560345/query-is-not-working/44567322#44567322

我刚刚创建了一个名为 dataimport 的临时表

[表格格式][1]

并写了一个查询,

SELECT `EnNo`, work_dt,
        SEC_TO_TIME(sum(TIMESTAMPDIFF(SECOND,login,logout))) as time_worked 
from (
    SELECT `EnNo`, date(`DateTime`) as work_dt, `DateTime` as login
        , coalesce(
              (SELECT MIN(`DateTime`) 
               FROM `dataimport` as b 
               WHERE a.EnNo = b.EnNo 
                 and date(a.`DateTime`) = date(b.`DateTime`)
                 and b.`DateTime` >= a.`DateTime` 
                 and b.`INOUT` = 'E'
              ), now()) AS logout
    FROM `dataimport` AS a 
    WHERE a.`INOUT` = 'S'
) as t
GROUP BY `EnNo`, work_dt

最后得到的输出为,

[输出][2]

希望这是你正在寻找的。[1]:https ://i.stack.imgur.com/OEEMe.png [2]:https ://i.stack.imgur.com/g6ivm.png

于 2017-06-15T12:22:43.740 回答
0

改变你的

SELECT HOUR(TIMEDIFF(end,start)) AS 'totalHour'    

SELECT sum(TIMESTAMPDIFF(HOUR, end, start)) AS 'totalHour'
于 2013-04-02T12:18:47.953 回答
0

SELECT IF(DATE(datetime_end) = DATE(datetime_start), TIMEDIFF(datetime_end,datetime_start), IF(DATEDIFF(datetime_start,datetime_end) > 1, ADDTIME( TIME_FORMAT(CONCAT((DATEDIFF(datetime_start,datetime_end) - 1) * 8,':00:00'), "%H:%i:%s"), ADDTIME( TIMEDIFF(datetime_end,CONCAT(DATE(datetime_end),' 08:00:00')), TIMEDIFF(CONCAT(DATE(datetime_start),' 17:00:00'),datetime_start) ) ) , ADDTIME( TIMEDIFF(datetime_end,CONCAT(DATE(datetime_end),' 08:00:00')), TIMEDIFF(CONCAT(DATE(datetime_start),' 17:00:00'),datetime_start) ) ) ) AS total_working_hrs FROM table

于 2021-04-09T08:39:56.577 回答