Mysql SUM时间与不同天数的范围

时间:2011-06-03 18:42:03

标签: mysql

我有以下表格结构(当然减少了):

CREATE TABLE `log` (
  `ID` int(11) unsigned NOT NULL auto_increment,
  `StartTime` datetime default NULL,
  `FinishTime` datetime default NULL,
  PRIMARY KEY  (`ID`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

一些示例数据:

StartTime           FinishTime
2011-06-02 18:00:00 2011-06-02 22:59:59
2011-06-02 23:00:00 2011-06-03 04:00:00
2011-06-03 10:00:00 2011-06-03 12:00:00

是否可以使用Mysql来计算2011-06-03 考虑第二行的总时间,该行从昨天开始但到今天结束?

我当前的查询:

SELECT SUM(UNIX_TIMESTAMP(FinishTime) - UNIX_TIMESTAMP(StartTime)) AS seconds
FROM log WHERE StartTime >= '2011-06-03 00:00:00' AND FinishTime  <= '2011-06-03 23:59:59'

由于StartTime条件,这将删除第二条记录。

如何才能获得今天使用的总共6小时? (第二行+第三行,昨天记录的第二行除外)。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以执行的操作是查找包含目标日期的部分或全部的开始/结束时间,但是将时间“裁剪”到当天的限制。例如:

SELECT SUM(
  UNIX_TIMESTAMP(
    CASE WHEN FinishTime > '2011-06-03 23:59:59' THEN '2011-06-03 23:59:59' 
         ELSE FinishTime END
  ) - 
  UNIX_TIMESTAMP(
    CASE WHEN StartTime < '2011-06-03 00:00:00' THEN '2011-06-03 00:00:00' 
         ELSE StartTime END
  )
) AS seconds
FROM log 
WHERE FinishTime >= '2011-06-03 00:00:00' AND StartTime  <= '2011-06-03 23:59:59'
AND FinishTime > StartTime

N.B。:注意最后的额外标准,那里。您希望所有记录在目标日之内或之后完成,以及在目标日之前或之内开始的所有记录,但由于可能存在重叠,您还需要指定StartTime在FinishTime之前到来!