Member 10696161 Ответов: 1

Расчет времени отпуска - как показать правильное время вместо ограничения значения времени mysql 838:59:59


В этом случае у меня есть работник, который имеет 1 год отпускных дней (около 360 дней):

+--------+---------+---------+-------------+---------+-----------+
|ID_LEAVE|ID_WORKER| BEGIN_DATE          | END_DATE              |
+--------+---------+---------+---------+------------+------------+
| 4      |   26    |2019-03-19 07:00:00  |2020-03-19 15:00:00    |  
+--------+---------+---------+----------------------+------------+

Когда я собираюсь запустить команду Mysql ("что вы пробовали"), которая вычисляет время отпуска (без выходных и праздников), то она показывает примерно так:

+--------+---------+---------+-------------+---------+----------+----------+
|ID_LEAVE|ID_WORKER| BEGIN_DATE          | END_DATE             |LEAVE TIME|
+--------+---------+---------+---------+------------+-----------+----------+
| 4      |   26    |2019-03-19 07:00:00  |2020-03-19 15:00:00   |838:59:59 |
+--------+---------+---------+----------------------+-----------+----------+

А это примерно в 838:59:59... 35 дней.

У меня с этим проблемы. Можно ли точно рассчитать время отпуска (от 1 года в формате чч:мм:СС)? Заранее благодарю вас за любой ответ.

Что я уже пробовал:

Я пытался:

SELECT leaves.ID_LEAVE, 
leaves.ID_WORKER, 
workers.IMIE, 
workers.NAZWISKO, 
leaves.BEGIN_DATE, 
leaves.END_DATE, 
TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(TIME(leaves.END_DATE), TIME(leaves.BEGIN_DATE))))), '%H:%i:%s') AS 'LEAVE TIME' 
FROM (SELECT ADDDATE('1970-01-01', t4 * 10000 + t3 * 1000 + t2 * 100 + t1 * 10 + t0) AS date_value 
FROM (SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0, 
(SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1, 
(SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2, 
(SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3, 
(SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4) calendar 
INNER JOIN project1.leaves ON calendar.date_value BETWEEN DATE(leaves.BEGIN_DATE) AND DATE(leaves.END_DATE) 
INNER JOIN project1.workers ON leaves.ID_WORKER = workers.ID_WORKER 
WHERE NOT WEEKDAY(date_value) IN (5, 6) AND NOT DATE(date_value) IN (SELECT HOLIDAY_DATE FROM project1.holidays) 
GROUP BY ID_LEAVE;


Но я не знаю, что мне делать.

1 Ответов

Рейтинг:
2

Peter_in_2780

Быстрый взгляд на MySQL :: MySQL 5.5 справочное руководство :: 12.7 функции даты и времени[^] показывает несколько альтернатив. В частности, TIMESTAMPDIFF() и UNIX_TIMESTAMP (), которые будут управлять гораздо большими интервалами (например, MAXINT секунд или около того).