//night shift employee
id from_time to_time task
1 21:00:00 22:00:00 - Cleaning(some task)
1 22:00:00 23:30:00 - Fumigation(can be some other task also)
1 4:00:00 7:00:00 - Disinfection
1 2:00:00 4:00:00 - Break
1 23:30:00 2:00:00 - Fogging
//day shift employee
2 09:00:00 10:00:00 - Cleaning(some task)
2 16:00:00 18:30:00 - Disinfection
2 11:30:00 14:00:00 - Fumigation(can be some other task also)
2 14:00:00 16:00:00 - Fogging
2 10:00:00 11:30:00 - Break
我需要根据 from_time 按升序对任务进行排序
SELECT * FROM testing WHERE emp_id='2' ORDER BY from_time ASC
上述查询适用于白班员工,但不适用于夜班员工
SELECT * FROM testing WHERE emp_id='1'
ORDER BY
CASE
WHEN CAST(from_time AS TIME) > '12:00:00' THEN 1
ELSE 2
END,
CAST(from_time AS TIME) ASC;
上述查询适用于夜班员工,但不适用于白班员工
如何解决这个问题?
我需要一个查询,可以根据 from_time 对夜班和白班员工任务进行排序。
您可以查看每个员工班次
from_time
的最小和最大时间差:
SELECT *
FROM testing t1
JOIN (
SELECT id, TIMEDIFF(MAX(from_time), MIN(from_time)) AS diff
FROM testing
GROUP BY id
) t2 ON t1.id = t2.id
ORDER BY t1.id, IF(t2.diff > '12:00' AND from_time < '12:00', from_time + INTERVAL 24 HOUR, from_time);
输出:
id | 从_时间 | 到_时间 | 任务 |
---|---|---|---|
1 | 21:00:00 | 22:00:00 | 清洁(某些任务) |
1 | 22:00:00 | 23:30:00 | 熏蒸 |
1 | 23:30:00 | 02:00:00 | 起雾 |
1 | 02:00:00 | 04:00:00 | 休息 |
1 | 04:00:00 | 07:00:00 | 消毒 |
2 | 09:00:00 | 10:00:00 | 清洁(某些任务) |
2 | 10:00:00 | 11:30:00 | 休息 |
2 | 11:30:00 | 14:00:00 | 熏蒸(也可以是其他任务) |
2 | 14:00:00 | 16:00:00 | 起雾 |
2 | 16:00:00 | 18:30:00 | 消毒 |
这是一个db<>小提琴。
最好以某种方式链接到轮班开始时间,但这可能会根据您的轮班模式而起作用。