我試圖在上午8點和下午6點之間的時間表中查找時差。我能夠找到記錄記錄的差距,但我無法弄清楚如何確定記錄是否「錯過」 - 意味着如果記錄是在上午8:30開始的,我無法弄清楚如何識別30分鐘的差距上午8點到8點30分(即他們開始工作到很晚)。在特定時間內查找時間表數據中的空白
在下面例子中,我可以找到關於5/8 12和下午12:30,而不是8 am-8:30am間隙和5:30之間的兩個間隙到下午6點的間隙,和8 am-8:30am間隙5/10。
任何想法指向我在正確的方向我如何可以接近這一點?
drop table #time;
create table #time (
TimesheetId int not null
, StartTime datetime not null
, EndTIme datetime not null
);
insert into #time (TimesheetId, StartTime, EndTime)
values (210, '2017-05-08 05:30:00.000', '2017-05-08 06:30:00.000')
, (210, '2017-05-08 06:30:00.000', '2017-05-08 08:30:00.000')
, (210, '2017-05-08 08:30:00.000', '2017-05-08 12:00:00.000')
, (210, '2017-05-08 12:30:00.000', '2017-05-08 18:30:00.000')
, (210, '2017-05-09 08:30:00.000', '2017-05-09 12:00:00.000')
, (210, '2017-05-09 12:30:00.000', '2017-05-09 17:30:00.000')
, (210, '2017-05-09 22:30:00.000', '2017-05-10 05:30:00.000')
, (210, '2017-05-10 08:30:00.000', '2017-05-10 18:00:00.000')
;
; with t1 as (
SELECT TimesheetId
, StartTime
, lag(EndTime) OVER (PARTITION BY TimesheetId ORDER BY StartTime) AS prev_endtime
FROM #time
where datepart(HH, StartTime) <= 18
and datepart(HH, EndTime) >= 8
)
select prev_endtime as gapStart
, StartTime as gapEnd
from t1
where StartTime <> prev_endtime
and cast(prev_endtime as date) = cast(StartTime as date)
;
你可以在你的地方添加「AND datepart(MM,startTime)<> 00」和EndTime相同 – M84
我不認爲他會工作@ m84作爲開始時間可以是上午7:30,結束時間是在早上8點,這是允許的。 05/08的 – Greg
,這個怎麼樣? (210,'2017-05-08 06:30:00.000','2017-05-08 08:30:00.000'),你能否更新你的預期結果集? – CuriousKid