2016-12-28 4 views
0

У меня есть следующая таблица:TimeDiff избежать отрицательного значения

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', 
) 

, в котором Datas может выглядеть примерно так:

> +---------------------------------------------------------------+ 
> + 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 wherease значение NightEnD может находиться в диапазоне между 21:00:01 и 5: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

Если значение NightEnD падает между 00:00:00 и 05:00:00 (включительно), то вам нужно добавить 1 день до значения NightEnD. – Shadow

+0

Да, я очень этому понимаю, я просто не знаю, как это сделать в sql – grunk

ответ

1

Если значение для ночных клубов находится между 00:00:00 и 05:00:00 (включительно), вам необходимо добавить 1 день к значению ночного дня. Вы можете сделать это с if() и addtime() функции MySQL,:

TIMEDIFF(if(nightend >='00:00:00' and nightend<='05:00:00',addtime(nightend,'24:00:00'),nightend),nightstart) 
Смежные вопросы