本文介绍了超过MySQL的TIME值限制838:59:59的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

标题可能有点令人困惑,所以请允许我解释一下.我正在用一张桌子记录我的工作日志.每天,我都会创建一个条目,说明从什么时间到什么时间工作,并添加一条注释来描述我的工作.

The title might be a bit confusing so allow me to explain. I'm using a table to record my work logs. Every day I'll create an entry stating from what time to what time I have worked and I'll add a comment describing what I did.

然后,我使用查询来比较时间戳,以准确计算出当天我工作了多少小时和几分钟.此外,我使用查询来计算我全年工作的小时数和分钟数的总和.那就是我遇到问题的地方.我的查询如下.

I then use a query to compare the timestamps to figure out exactly how many hours and minutes I have worked that day. Additionally, I use a query to calculate the sum of hours and minutes I have worked the entire year. That's where I'm running into a problem. My query is as follows.

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,这很有意义,因为那是限制.

By default, MySQL TIME fields allow a time range of '-838:59:59' to '838:59:59'. I have currently logged more than 900 hours of work this year though, and I want the result of my query to reflect this. Instead, the result is 838:59:59, which makes sense because that is the limit.

有没有解决的办法,所以查询结果可以超过839小时,还是我必须使用PHP之类的方法遍历整个表并将其全部累加?我有点想避免这种情况.

Is there any way around this so the result of the query can go beyond 839 hours, or would I have to use something like PHP to go over the entire table and add it all up? I kind of want to avoid that if possible.

推荐答案

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

I'd just retrieve the total number of seconds worked, and convert to hours/minutes as required in the presentation layer of my application (it is, after all, a simple case of division by 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.";
?>

这篇关于超过MySQL的TIME值限制838:59:59的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-22 12:46