我有下表:

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之间开始,因此,夜间值的范围可以在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


当我有两天的时间重叠时(即:从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结束时间是从第二天开始?

最佳答案

如果夜间值介于00:00:00到05:00:00(含)之间,则需要将1天添加到夜间值中。您可以使用MySQL的if()addtime()函数执行此操作:

TIMEDIFF(if(nightend >='00:00:00' and nightend<='05:00:00',addtime(nightend,'24:00:00'),nightend),nightstart)

关于mysql - Timediff避免负值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41363696/

10-12 17:32
查看更多