查找'break'记录

问题描述:

您能否看看下面的任务?查找'break'记录

我有'SCHEDULE'表。它具有以下结构:

CREATE TABLE SCHEDULE (
    EMPLOYEE nvarchar(50), 
    SHIFT_START datetime, 
    SHIFT_END datetime 
) 

“日程”中包含的数据:

INSERT INTO SCHEDULE(EMPLOYEE,SHIFT_START,SHIFT_END) VALUES 
('EMP01','2017-08-21 09:00:00.000','2017-08-21 12:00:00.000'), 
('EMP01','2017-08-21 12:30:00.000','2017-08-21 16:00:00.000'), 
('EMP01','2017-08-21 17:00:00.000','2017-08-21 20:00:00.000'), 
('EMP02','2017-08-21 09:00:00.000','2017-08-21 12:00:00.000'), 
('EMP02','2017-08-21 13:30:00.000','2017-08-21 16:00:00.000'), 
('EMP02','2017-08-21 16:30:00.000','2017-08-21 20:00:00.000'), 
('EMP03','2017-08-21 09:00:00.000','2017-08-21 12:00:00.000'), 
('EMP03','2017-08-21 15:30:00.000','2017-08-21 20:00:00.000') 

enter image description here

任务:如果转变的开始日期和每个前一移位结束日期之间的区别员工的每个日期大于1分钟且小于60分钟 - 比向现有数据集添加一行('中断'行)。

预期的结果将是以下几点: enter image description here

预先感谢您!

+2

你有什么尝试?什么不起作用? – nondestructive

+0

目前,我没有自己的代码,但我已经开始实施它。 –

+0

那么,你需要什么帮助呢?我不确定你在问什么。 – nondestructive

您需要先前的值。在SQL Server 2008中,有一种方法使用apply。为了让更多的行:

select employee, prev_shift_end, shift_start, 'break' as shift_type 
from (select s.*, sprev.shift_end as prev_shift_end 
     from schedule s cross apply 
      (select top 1 s2.* 
      from schedule s2 
      where s2.employee = s.employee and 
        s2.shift_start < s.shift_start 
      order by s2.shift_start desc 
      ) sprev 
    ) s 
where datediff(minute, prev_shift_end, shift_start) between 1 and 60; 

你可以把insert逻辑之前在表中插入行。

+0

使用交叉适用于使用子查询的任何好处,或者这只是一个方便的问题? –

+0

非常感谢,戈登!这太神奇了。 –

+1

@DavidFreeman请将帖子标记为答案,否则会弹出为永远无法解答的问题。 –