计算休假时间 - 如何显示正确的时间而不是mysql的TIME值限制为838:59:59

问题描述:

在这种情况下,我有一名工作人员有1年假期(约360天):



In this case i have a worker who has 1 year of leave days (about 360 days):

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



当我打算运行Mysql Command时(你有什么事吗?尝试)计算休假时间(没有周末和假期)然后它显示如下:




When i I'm going to run Mysql Command ("What have you tried") which calculates leave time (without weekends and holidays) then it shows about like that:

+--------+---------+---------+-------------+---------+----------+----------+
|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年,格式为HH:mm:ss)?提前感谢您的回答。



我尝试过:



我试过了:




Which time 838:59:59 is about... 35 days.

I have a trouble with it. Is that possible to calculate exactly leave time (of 1 year in format HH:mm:ss)? Thank you in advance for any answer.

What I have tried:

I've tried:

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;





但我不知道我应该怎么做吗?



But i don't know what should i do?

快速查看 MySQL :: MySQL 5.5参考手册:: 12。7日期和时间函数 [ ^ ]显示几个替代品。具体来说,TIMESTAMPDIFF()和UNIX_TIMESTAMP()将管理更大的间隔(想想MAXINT秒或左右)。
A quick look at MySQL :: MySQL 5.5 Reference Manual :: 12.7 Date and Time Functions[^] shows a couple of alternatives. Specifically TIMESTAMPDIFF() and UNIX_TIMESTAMP() which will manage much larger intervals (think MAXINT seconds or thereabouts).