2017-08-21 36 views
2

您能否看看下面的任務?查找'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

回答

3

您需要先前的值。在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請將帖子標記爲答案,否則會彈出爲永遠無法解答的問題。 –