我正在尝试对时间值求和,并将其设置为小时:分钟:秒的格式,即100:30:10。
SEC_TO_TIME(SUM(TIME_TO_SEC(ActualHours))) AS Hours
但是我有一个问题,因为时间的最大值是838:59:59。 因此,如果总和超过该值,则不会显示,即等于900小时,则显示为838:59:59,这是错误的。
如果超过838:59:59,如何显示总小时数?
答案 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