SUM时间值MySQL

时间:2018-10-09 14:12:01

标签: mysql time mysql-workbench

我正在尝试对时间值求和,并将其设置为小时:分钟:秒的格式,即100:30:10。

SEC_TO_TIME(SUM(TIME_TO_SEC(ActualHours))) AS Hours

但是我有一个问题,因为时间的最大值是838:59:59。 因此,如果总和超过该值,则不会显示,即等于900小时,则显示为838:59:59,这是错误的。

如果超过838:59:59,如何显示总小时数?

3 个答案:

答案 0 :(得分:1)

如果我必须使用SQL进行此转换,我将执行以下操作:

SELECT CONCAT(              (   _secs_    DIV 3600)
         , ':'
         , RIGHT(CONCAT('0',(   _secs_    DIV 60  ) MOD 60 ),2)
         , ':'
         , RIGHT(CONCAT('0',(   _secs_              MOD 60)),2)
       ) AS `h:mm:ss`

我们可以将_secs_替换为返回要转换的秒数的表达式。使用问题中给出的表达式,我们得到如下内容:

SELECT CONCAT(              (  SUM(TIME_TO_SEC(ActualHours))  DIV 3600)
         , ':'
         , RIGHT(CONCAT('0',(  SUM(TIME_TO_SEC(ActualHours))  DIV 60  ) MOD 60 ),2)
         , ':'
         , RIGHT(CONCAT('0',(  SUM(TIME_TO_SEC(ActualHours))            MOD 60)),2)
       ) AS `h:mm:ss`

演示

此答案中提供的语法在MySQL 5.6中有效。作为演示,使用用户定义的变量@_secs作为表达式的秒数:

设置用于演示的用户定义变量:

SELECT @_secs_ := ( 987 * 3600 ) + ( 5 * 60 ) + 7  ;

返回

@_secs := ( 987 * 3600 ) + ( 5 * 60 ) + 7  
-----------------------------------------
                                  3553507

演示查询模式:

SELECT CONCAT(              (  @_secs_    DIV 3600) 
         , ':'
         , RIGHT(CONCAT('0',(  @_secs_    DIV 60  ) MOD 60 ),2)
         , ':'
         , RIGHT(CONCAT('0',(  @_secs_              MOD 60)),2)
       ) AS `hhh:mm:ss`

返回

  hhh:mm:ss
  ---------
  987:05:07

答案 1 :(得分:0)

使用一些简单的数学运算来连接从几秒钟开始的时间段,将35000替换为您的列。

[TokenBasedAuthentication]
public class SettingsController : ApiController, ISettings
{
}

fiddle一起玩

答案 2 :(得分:0)

这是我们执行此操作的一种方法:

SELECT
    CONCAT(CAST(FLOOR(seconds / 3600) AS CHAR(50)), ':',
           CAST(FLOOR(60*((seconds / 3600) - FLOOR(seconds / 3600))) AS CHAR(50)), ':',
           CAST(seconds % 60 AS CHAR(50))) AS time
FROM yourTable;

输入10,000,000(一千万)秒,将产生:

2777:46:40

Demo