Click here to Skip to main content
15,888,610 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
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    |  
+--------+---------+---------+----------------------+------------+

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 |
+--------+---------+---------+----------------------+-----------+----------+

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?
Posted
Updated 20-May-19 12:28pm

1 solution

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).
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900