我有下表:
CREATE TABLE `activities` (
`id` int(10) unsigned NOT NULL,
`startdate` date NOT NULL,
`nightstart` time DEFAULT NULL COMMENT 'Heure de début du travail de nuit',
`nightend` time DEFAULT NULL COMMENT 'Heure de fin du travail de nuit',
)
其中数据可能类似于:
> +---------------------------------------------------------------+
> + id | startdate | nightstart | nightend |
> +---------------------------------------------------------------+
> + 1 | 2016-09-15 | 21:00:00 | 03:00:00 +
> + 2 | 2016-09-25 | 01:00:00 | 04:30:00 +
> + 3 | 2016-10-01 | 00:00:00 | 03:35:00 +
我的目标是获得每月夜间花费的时间。 nighstart值可以在21:00:00和04:59:59之间开始,其中nightend值可以在21:00:01和05:00:00之间
我尝试过这样的事情:
SELECT MONTH(startdate) as month,
SUM(TIME_TO_SEC(TIMEDIFF(nightend,nightstart))) as total
FROM `activities`
WHERE nightstart IS NOT NULL AND YEAR(startdate) = 2016
GROUP BY month ORDER BY month ASC
当我有2天的时间重叠时(即:从21:00:00开始结束于01:00:00),这不起作用,因为01 -21会给我一个负值。 我只有一个开始日期,并且该方案无法更改。
我可以通过获取PHP端的所有数据并对每一行进行一些计算来解决问题:
if ($nightstart < $nightend) {
$totalSec = $rawData['total'];
} else {
if ($nightstart >= 21 && ($nightend <= 4 || ($nightend == 5 && $minEnd == 0))) {
$nightend->add(new \DateInterval('P1D'));
$totalSec = $nightend->getTimestamp() - $nightstart->getTimestamp();
}
}
但如果可能的话,我宁愿在SQL中这样做。
如果开始时间是在午夜之前,有没有办法告诉SQL结束时间是从第二天开始?
答案 0 :(得分:1)
如果nightend值介于00:00:00和05:00:00(含)之间,那么您需要在nightend值中添加1天。您可以使用MySQL的if()
和addtime()
函数执行此操作:
TIMEDIFF(if(nightend >='00:00:00' and nightend<='05:00:00',addtime(nightend,'24:00:00'),nightend),nightstart)