首页 文章

MySQL - 总结每天的时段/班次

提问于
浏览
-1

让我们假设我们有一种shift-scheduler应用程序 . 您可以将用户置于轮班/时隙中 . 有一个摘要视图,显示一个人每天需要多少小时才能正确填充计划的班次(时间差在min(shift.start)和max(shift.end)之间) . 另一个值是与人/天相关的班次/时隙的总和 .

例:

Shift 1 | Start: 27.08.2015 08:00 | End: 27.08.2015 10:00
Shift 2 | Start: 27.08.2015 08:00 | End: 27.08.2015 10:00
Shift 3 | Start: 27.08.2015 08:30 | End: 27.08.2015 09:30
Shift 4 | Start: 27.08.2015 10:00 | End: 27.08.2015 11:00
Shift 5 | Start: 27.08.2015 10:30 | End: 27.08.2015 11:30

现在,如果一个人只在Shift 1和Shift 4中,那么很容易对变化进行补偿 . 这将使upp达到3小时 . 但是,如果这个人在所有班次(1-5)中被推算,那么这不再是微不足道的(因为时间平行或重叠) . 现在你需要忽略具有相同时隙的移位(移位1和2相等,因此只有一个应该计数)并且还移位位于其他移位的时间(如移位3,即移位1和2的插槽中的移位) . Shift 5在班次4的时间段中间开始,但持续时间更长,因此只有delta才能计算 .

我的问题是:是否有可能直接在sql语句(mysql)中计算一个人/天的班次总和?上面例子的简单SUM可以生成7小时 . 但正确的SUM(考虑平行或重叠的移位等)将使3小时30分钟 . 我从来没有找到这个问题的答案,只能通过shift.start,shift.end或DISTINCT shift.start,shift.end分组来消除相等的转换 .

这是一个可以求和并忽略并行移位(相同时隙)的查询示例 .

SELECT

us.idUser, 

CONCAT(SUBSTR(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(sh.end, sh.start)))),1,2),"h ",
SUBSTR(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(sh.end, sh.start)))),4,2),"m") AS sumD

FROM
(

SELECT start, end, id
FROM shift
WHERE (DATE(shift.start) = (SELECT DATE(shift.start) FROM shift WHERE shift.id = 12126))
GROUP BY start, end

) sh

LEFT JOIN user_shift us
ON sh.id = us.idShift

GROUP BY us.idUser

有一个表格移位,包含所有班次信息(开始,结束等) . 另一个表是user_shift,它包含idShift和idUser(其中shift是用户调度的) . 查询获取shift.id(12126),获取该班次的日期以获得同一天的其他班次 . 稍后,加入会将当天的所有班次与用户ID进行匹配 . 示例结果是(idUser:123 | sumD:5h 30m) .

1 回答

  • 0

    逻辑是:

    • 注意表格中第一个班次的开始,定义你的总和 .

    • 获取下一个开始/结束 .

    • 如果表为空,则添加starttime

    • 如果它是表格中第一个条目的结尾,那么总结一下 .

    • 如果是结束,请从表中删除相应的开头 .

    • 如果是开头,请将其添加到您的表格中 .

    • 如果您的列表不为空,请转到2 .

    我不认为有可能作为一个查询,即使可能它不是一个简单的查询来构建该逻辑,也许考虑不在sql服务器上 .

相关问题