在MySQL查询中,我使用 timediff / time_to_sec 函数计算两个日期时间之间的总分钟数。
例如:
2010-03-23 10:00:00 - 2010-03-23 08:00:00 = 120 minutes
我想做的是排除在选定时间范围内发生的任何休息。
2010-03-23 10:00:00 - 2010-03-23 08:00:00 - (break 08:55:00 to 09:10:00) = 105 minutes
是否有一个好的方法可以做到这一点而无需求助于一长串的嵌套IF语句?
UPDATE1:
为了澄清-我正在尝试计算用户完成给定任务所需的时间。如果他们喝咖啡休息时间,则需要排除该时间段。茶歇时间为固定时间。
将所有您在这段时间内发生的休息时间相加,然后减去timediff / time_to_sec函数的结果
SELECT TIME_TO_SEC(TIMEDIFF('17:00:00', '09:00:00')) -- 28800 SELECT TIME_TO_SEC(TIMEDIFF('12:30:00', '12:00:00')) -- 1800 SELECT TIME_TO_SEC(TIMEDIFF('10:30:00', '10:15:00')) -- 900 -- 26100
假设这个结构:
CREATE TABLE work_unit ( id INT NOT NULL, initial_time TIME, final_time TIME ) CREATE TABLE break ( id INT NOT NULL, initial_time TIME, final_time TIME ) INSERT work_unit VALUES (1, '09:00:00', '17:00:00') INSERT break VALUES (1, '10:00:00', '10:15:00') INSERT break VALUES (2, '12:00:00', '12:30:00')
您可以使用下一个查询来计算它:
SELECT *, TIME_TO_SEC(TIMEDIFF(final_time, initial_time)) total_time , (SELECT SUM( TIME_TO_SEC(TIMEDIFF(b.final_time, b.initial_time))) FROM break b WHERE (b.initial_time BETWEEN work_unit.initial_time AND work_unit.final_time) OR (b.final_time BETWEEN work_unit.initial_time AND work_unit.final_time) ) breaks FROM work_unit