查找'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')
任务:如果转变的开始日期和每个前一移位结束日期之间的区别员工的每个日期大于1分钟且小于60分钟 - 比向现有数据集添加一行('中断'行)。
预先感谢您!
您需要先前的值。在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
逻辑之前在表中插入行。
使用交叉适用于使用子查询的任何好处,或者这只是一个方便的问题? –
非常感谢,戈登!这太神奇了。 –
@DavidFreeman请将帖子标记为答案,否则会弹出为永远无法解答的问题。 –
你有什么尝试?什么不起作用? – nondestructive
目前,我没有自己的代码,但我已经开始实施它。 –
那么,你需要什么帮助呢?我不确定你在问什么。 – nondestructive