#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:
Итак, вам нужно вычислить это следующим образом:
- Количество часов в первый день болезни
- Количество часов в последний день болезни
- Количество дней болезни, умноженное на 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.