超过MySQL的TIME值限制为838:59:59

时间:2012-12-05 21:54:21

标签: mysql time sum

标题可能有点令人困惑,所以请允许我解释一下。我正在使用表来记录我的工作日志。每天我都会创建一个条目,说明我工作的时间和时间,我会添加评论来描述我的工作。

然后我使用查询来比较时间戳,以确切地知道我当天工作了多少小时和分钟。另外,我使用查询来计算我整年工作的小时和分钟的总和。这就是我遇到问题的地方。我的查询如下。

SELECT TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(entry_end_time, entry_start_time)))), '%H:%i') 
AS total FROM entry 
WHERE entry_date BETWEEN '2012-01-01' AND '2012-12-31' AND user_id = 3

默认情况下,MySQL TIME字段允许的时间范围为“-838:59:59”到“838:59:59”。我今年已经记录了超过900小时的工作,我希望我的查询结果能够反映出这一点。相反,结果是838:59:59,这是有道理的,因为这是限制。

有没有办法绕过这个,所以查询的结果可以超过839小时,或者我是否必须使用类似PHP的东西来遍历整个表格并将其全部添加?如果可能的话,我有点想避免这种情况。

6 个答案:

答案 0 :(得分:6)

我只是检索工作的总秒数,并根据我的应用程序的表示层中的需要转换为小时/分钟(毕竟,这是一个简单的除以60的情况):

<?
  $dbh = new PDO("mysql:dbname=$dbname", $username, $password);
  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

  $qry = $dbh->prepare('
    SELECT SUM(TIME_TO_SEC(entry_end_time)-TIME_TO_SEC(entry_start_time))
    FROM   entry 
    WHERE  entry_date BETWEEN :start_date AND :end_date
       AND user_id = :user_id
  ');

  $qry->execute([
    ':start_date' => '2012-01-01',
    ':end_date'   => '2012-12-31',
    ':user_id'    => 3
  ]);

  list ($totalMins, $remngSecs) = gmp_div_qr($qry->fetchColumn(), 60);
  list ($totalHour, $remngMins) = gmp_div_qr($totalMins, 60);

  echo "Worked a total of $totalHour:$remngMins:$remngSecs.";
?>

答案 1 :(得分:3)

查看没有TIME限制的timestampdiff。 即像(未经测试的):

SELECT CONCAT(
        TIMESTAMPDIFF(HOURS, entry_end_time, entry_start_time), 
        ":",
        MOD(TIMESTAMPDIFF(MINUTES, entry_end_time, entry_start_time),60)
      )
AS total FROM entry 
WHERE entry_date BETWEEN '2012-01-01' AND '2012-12-31' AND user_id = 3

结论并不理想,我相信会有一个更优雅的解决方案。

答案 2 :(得分:1)

一些简单的数学就可以解决问题,我将随机秒数(10000000)进行了硬编码

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

Fiddle

2777:46:40

答案 3 :(得分:0)

单独计算天数就足够了。
这是我使用的串联。

我用一个完全复制/可处理的示例进行了说明,以便于理解我们达到的限制(TIME format的最大值)
捆绑了一个免费的独角兽以简化逗号管理

((JavascriptExecutor)driver).executeScript ("document.getElementById('elementID').removeAttribute('readonly',0);");
SELECT 'pq7~' AS unicorn
#######################
##  Expected result  ##
#######################
## Total, formatted as days:hh:mm:ss ##
  ,CONCAT(
    FLOOR(TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24') / 86400)
    , ':'
    , SEC_TO_TIME(TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24') % 86400)
  ) AS Real_expected_result
#########################
## Calculation details ##
#########################
## Extracted days from diff ##
  ,FLOOR(TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24') / 86400) AS Real_days
## Extracted Hours/minutes/seconds from diff ##
  ,SEC_TO_TIME(TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24') % 86400) AS Real_hours_minutes_seconds

答案 4 :(得分:-1)

首先计算天差然后乘以24 * 60 * 60将其转换为秒然后再加上time_to_sec值结果

DATEDIFF(start_date,end_date)*24*60*60 + TIME_TO_SEC(TIMEDIFF(TIME(start_date),TIME(end_date))) 
AS sec_diff

有关详细信息,请查看codebucket- Surpassing time_to_sec() function maximum limit

答案 5 :(得分:-1)

select  concat(truncate(sum(time_to_sec(TIMEDIFF(hora_fim, hora_ini)))/3600,0), ':', 
TIME_FORMAT(sec_to_time(sum(time_to_sec(TIMEDIFF(hora_fim, hora_ini))) - truncate(sum(time_to_sec(TIMEDIFF(hora_fim, hora_ini)))/3600,0)*3600), '%i:%s'))
as hms from  tb_XXXXXX