MySQL重叠时间

时间:2018-09-23 08:58:45

标签: mysql sql

我有一个名为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

无论班次实际上有多久,我怎么能找到重叠部分?

2 个答案:

答案 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 search for interval overlap in list of intervals?)

,则将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

应该给您重叠的转变。 但这会给您两次转换,并且切换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