根据start_time对夜班员工任务进行排序

问题描述 投票:0回答:1
//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 对夜班和白班员工任务进行排序。

php sql mysql database sorting
1个回答
0
投票

您可以查看每个员工班次

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<>小提琴

最好以某种方式链接到轮班开始时间,但这可能会根据您的轮班模式而起作用。

© www.soinside.com 2019 - 2024. All rights reserved.