Как точно суммировать datetime (разница между end_date и begin_date) — mysql

#mysql #datetime #difference

#mysql #дата и время #разница

Вопрос:

Я использую в mysql. Я создал таблицу «Sikcness» и добавил одну запись:

  -------- --------- --------- ------------- -------- ---------- 
| Id_SICK|ID_WORKER| BEGIN_DATE          | END_DATE            |
 -------- --------- --------- ---------- ------------ --------- 
| 1      |   1     |2019-03-18 07:00:00  |2019-03-20 15:00:00  |  
 -------- --------- -------- ------------ ---------- ----------   
  

Затем я хотел бы суммировать во времени (разница во времени между столбцами End_date и begin_date) с помощью команды:

 SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(Sickness.END_DATE) - TIME_TO_SEC(Sickness.BEGIN_DATE))) AS 'SICKNESS TIME' FROM Sickness WHERE ID_WORKER = 1
  

Но у меня есть только этот результат (который неверен):

 SICKNESS TIME
08:00:00
  

Эта команда должна считать это следующим образом:

  --------- ------------- -------- ---------- 
| BEGIN_DATE          | END_DATE            |
 --------- ---------- ------------ --------- 
|2019-03-18 07:00:00  |2019-03-18 15:00:00  |  
 -------- ------------ ---------- ----------   
|2019-03-19 07:00:00  |2019-03-19 15:00:00  |  
 -------- ------------ ---------- ----------   
|2019-03-20 07:00:00  |2019-03-20 15:00:00  |  
 -------- ------------ ---------- ----------  
  

Тогда это было бы правильно:

 SICKNESS TIME
24:00:00
  

Какой запрос mysql я должен написать? Есть идеи? Приветствует.

Ответ №1:

Разницу в часах следует умножить на разницу в днях:

 mysql> SELECT SEC_TO_TIME(SUM((DATEDIFF(end_date, begin_date)   1) * (TIME_TO_SEC(END_DATE) - TIME_TO_SEC(BEGIN_DATE)))) AS 'SICKNESS TIME' FROM Sickness WHERE ID_WORKER = 1;
 --------------- 
| SICKNESS TIME |
 --------------- 
| 24:00:00      |
 --------------- 
1 row in set (0.00 sec)

  

Другой запрос с TIME_FORMAT:

 mysql> select time_format(SUM((datediff(end_date, begin_date)   1) * (time(end_date) - time(begin_date))), '%H:%i:%s') as 'SICKNESS TIME' from Sickness where id_worker = 1;
 --------------- 
| SICKNESS TIME |
 --------------- 
| 24:00:00      |
 --------------- 
1 row in set (0.00 sec)
  

Вы можете попробовать этот запрос на SQL Fiddle

Комментарии:

1. Я сделал с помощью этой команды, но она показала слишком много = 56:00:00. Мне нужен запрос, который считается так, как я описал вверху

2. Никакой разницы. Прошу прощения: (

3. Является ли ’24:00:00′ предпочтительным результатом?

4. проще TIME_FORMAT(SUM(TIMEDIFF(END_DATE, BEGIN_DATE)),'%T')

5. Да, это самое полезное для меня. Большое вам спасибо за помощь! 🙂

Ответ №2:

Итак, вам нужно вычислить это следующим образом:

  1. Количество часов в первый день болезни
  2. Количество часов в последний день болезни
  3. Количество дней болезни, умноженное на 8 (т. е. количество рабочих часов)

После завершения вам нужно сложить их, чтобы получить результат, например

 SELECT
TIMESTAMPDIFF(HOUR, begin_date, CONCAT(DATE(begin_date), ' 15:00:00'))  
(TIMESTAMPDIFF(DAY, begin_date, end_date) - 1) * 8  
TIMESTAMPDIFF(HOUR, CONCAT(DATE(end_date), ' 07:00:00'), end_date) AS time 
FROM test
WHERE worker = 1;
  

Вот SQL Fiddle.