mysql总工作时间

时间:2013-04-02 11:57:31

标签: php mysql

id     title                              start                    end
1   Doing Coding for this project.  2013-04-02 02:00:00     2013-04-02 04:00:00
2   Doing Coding for this project.  2013-04-02 04:00:00     2013-04-02 06:00:00
3   Doing Coding for this project.  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

这可能吗?

修改

从我收到的答案中我已经尝试了每一个人,但每次我得到44.5000,但它应该返回06:30:00

6 个答案:

答案 0 :(得分:3)

HOUR()函数的范围是0 to 23因此在diff中使用它的总小时数是不正确的。

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

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

如果你想为整个项目计算它,你必须总结所有的时间差异,并且它们打印格式可能与funciton类似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

答案 1 :(得分: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。 Pl交叉检查你的记录。

<强> FIDDLE

答案 2 :(得分:1)

尝试这样,它将为您提供总时数:

例如:

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

如果您针对上面的表运行此查询,则会显示输出4.5小时。

希望它会对你有所帮助。

答案 3 :(得分:1)

我已在其他帖子Query is not working

中回答

我刚刚创建了一个名为dataimport

的临时表

Table Format

并写了一个查询,

SELECT EnNo,work_dt,         SEC_TO_TIME(sum(TIMESTAMPDIFF(SECOND,登录,注销)))作为time_worked 来自(     选择EnNo,日期(DateTime)作为work_dt,DateTime作为登录         ,合并(               (选择MIN(DateTime)                从dataimport起b                在哪里a.EnNo = b.EnNo                  和日期(a。DateTime)=日期(b。DateTime)                  和b。DateTime&gt; = a。DateTime                  和b。INOUT ='E'               ),now())AS注销     来自dataimport AS     在哪里。INOUT ='S' )作为t GROUP BY EnNo,work_dt

最后输出为

Output

希望这就是你所看到的。

答案 4 :(得分:0)

更改您的

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

SELECT sum(TIMESTAMPDIFF(HOUR, end, start)) AS 'totalHour'

答案 5 :(得分: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