总时间值

bwitn5fc  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(147)

这个问题在这里已经有答案了

超过mysql的时间值限制838:59:59(6个答案)
两年前关门了。
我试图将时间值求和,并以hours:minutes:秒,即100:30:10。

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

但我有个问题,因为时间的最大值是838:59:59。因此,如果时间总和超过这个值,它就不会显示,也就是说,如果它等于900小时,它将显示为838:59:59,这是错误的。
如果超过838:59:59,如何显示总小时数?

gzszwxb4

gzszwxb41#

如果必须用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
xoefb8l8

xoefb8l82#

使用一些简单的数学来计算从秒开始的时间段,用你的列替换35000。

SELECT CONCAT(FLOOR(35000/3600),':',FLOOR((35000%3600)/60),':',(35000%3600)%60)

一把小提琴

qnakjoqk

qnakjoqk3#

我们有一种方法可以做到这一点:

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;

对于10000000(一千万)秒的输入,这将生成:

2777:46:40

演示

相关问题