我有一个名为shifts的表,其中包含client_id,employee_id,Shift_start,shift_end。
shift_start和shift_end是时间戳记。
雇员(护士)分配给客户,通常轮班24小时,因此以下是典型情况。
client_id employee_id shift_start shift_end
15 100 2018-09-01 07:00:00 2018-09-01 19:00:00
15 200 2018-09-01 19:00:00 2018-09-02 07:00:00
现在假设员工200迟到30分钟,她的shift_start应该为2018-09-01 19:30:00,而员工100 shift_end应该更改为2018-09-01 19:30:00。直截了当。
但是,想象一下200名员工不诚实地不改变轮班开始时间并声称自己准时来了。这样我们就会有超过24小时的时间,而一天不能超过24小时向客户收费。
在这种情况下如何搜索重叠的班次?
我有一个查询,它查找超过24小时的班次,它的工作原理像一个魅力。但是,以上场景可能是两个6小时轮班,但是类似的场景是这样的:
client_id employee_id shift_start shift_end
15 100 2018-09-01 06:00:00 2018-09-01 12:30:00
15 200 2018-09-01 12:00:00 2018-09-02 18:00:00
我对24小时情况的查询如下:
select client_id, date(shift_start) ,
sum(time_to_sec(timediff(shift_end, shift_start )) / 3600) as totalTime
from shifts
where shift_month = '2018-09'
group by date(shift_start),client_id
having sum(time_to_sec(timediff(shift_end, shift_start )) / 3600) > 24
无论班次实际上有多久,我怎么能找到重叠部分?
答案 0 :(得分:0)
如果我对问题的理解正确,那么您需要在报告的班次和提供服务的总时间之间的最短时间
所以我们需要对这些变化求和,并找出第一次和上次报告之间的差异
SELECT
client_id,
dte,
total_reported_time,
(time_to_sec(timediff(max_shift_end, min_shift_start )) / 3600) as shift_time,
LEAST(total_reported_time, (time_to_sec(timediff(max_shift_end, min_shift_start )) / 3600)) AS min_shift_time
FROM
(
SELECT
client_id, date(shift_start) AS dte,
sum(time_to_sec(timediff(shift_end, shift_start )) / 3600) as total_reported_time,
MAX(shift_end) AS max_shift_end,
MIN(shift_start) AS min_shift_start,
FROM
shifts
WHERE
shift_month = '2018-09'
GROUP BY
client_id, dte
) a
GROUP BY
client_id, dte
答案 1 :(得分:0)
如果a.shift_end> b.shift_start和a.shift_start
如此
select * from shifts a inner join shifts b on a.client_id = b.client_id
and a.shift_end > b.shift_start and a.shift_start < b.shift_end
应该给您重叠的转变。 但这会给您两次转换,并且切换a和b, 将联接限制为仅在较晚的开始班次时才能完成:
select * from shifts a inner join shifts b on a.client_id = b.client_id
and a.shift_end > b.shift_start and a.shift_start < b.shift_end
and a.shift_start < b.shift_start