MySQL:如何SUM()组上的TIMEDIFF()?

And*_*rew 15 mysql sql aggregate-functions

所以我有一组看起来像这样的结果:

SELECT User_ID, StartTime, EndTime, TIMEDIFF(EndTime, StartTime) AS TimeDiff
FROM MyTable

------------------------------------------------------------------
| User_ID |       StartTime     |         EndTime     | TimeDiff |
------------------------------------------------------------------
|    1    | 2010-11-05 08:00:00 | 2010-11-05 09:00:00 | 01:00:00 |
------------------------------------------------------------------
|    1    | 2010-11-05 09:00:00 | 2010-11-05 10:00:00 | 01:00:00 |
------------------------------------------------------------------
|    2    | 2010-11-05 06:30:00 | 2010-11-05 07:00:00 | 00:30:00 |
------------------------------------------------------------------
|    2    | 2010-11-05 07:00:00 | 2010-11-05 09:00:00 | 02:00:00 |
------------------------------------------------------------------
|    2    | 2010-11-05 09:00:00 | 2010-11-05 10:00:00 | 01:00:00 |
------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

现在我需要通过User_IDSUM()TimeDiff 对结果进行分组.如果我添加一个GROUP BY子句,它不是SUM()TimeDiff(我不希望它).我怎样才能SUM()为每个用户提供TimeDiff?

OMG*_*ies 37

使用:

  SELECT t.user_id,       
         SEC_TO_TIME(SUM(TIME_TO_SEC(t.endtime) - TIME_TO_SEC(t.starttime))) AS timediff
    FROM MYTABLE t
GROUP BY t.user_id
Run Code Online (Sandbox Code Playgroud)

脚步:

  1. 使用TIME_TO_SEC将TIME转换为数学运算的秒数
  2. 总结差异
  3. 使用SEC_TO_TIME将秒转换回TIME

根据样本数据,我刚才建议:

  SELECT t.user_id,       
         TIMEDIFF(MIN(t.startdate), MAX(t.enddate)) AS timediff
    FROM MYTABLE t
GROUP BY t.user_id   
Run Code Online (Sandbox Code Playgroud)

注意:如果您使用datetime,则此代码中存在错误.TIME_TO_SEC仅转换时间段,因此如果时钟超过午夜,您将得到大的负数.使用UNIX_TIMESTAMP代替总和.SEC_TO_TIME的值也大于3020399秒,例如SELECT TIME_TO_SEC(SEC_TO_TIME(3020400)); 如果你看到这个值838:59:59你已达到最大值,可能只需要除以3600就可以显示小时数.