Ниже фрагмент кода должен делать свою работу, я должен был сделать изменения в Shift Policy
table
- добавлено column
ShiftType
-
declare @shiftpolicy table(time_in varchar(10),time_out varchar(10),ShiftType NVARCHAR(2))
insert into @shiftpolicy values ('07:30','12:30','M'),('13:30','16:30','A')
declare @attendance table(time_in varchar(10),time_out varchar(10))
insert into @attendance values ('07:00','07:06'),('07:10','08:30'),('08:45','12:45'),('13:55','15:30'),('16:15','16:50')
select * from @shiftpolicy
select * from @attendance
SELECT * FROM
(
select case
when row = 1 then
case when time_in > DefTimeIn then DefTimeIn--+' - '+convert(nvarchar(50),time_in)
else ''
end
when row = last
then case when time_out < DefTimeOut then time_out--+' - '+convert(nvarchar(50),DefTimeOut)
else ''
end
else ''
end--*
[Out]
,case
when row = 1 then
case when time_in > DefTimeIn then time_in
else ''
end
when row = last
then case when time_out < DefTimeOut then DefTimeOut
else ''
end
else ''
end--,*
[IN]
--select *
from
(
select last_value(row) over (partition by ShiftType order by ShiftType) last ,*
from
(
select ts.time_in DefTimeIn,ts.time_out DefTimeOut,ts.ShiftType,ta.*,ROW_NUMBER() OVER(PARTITION BY ts.time_in,ShiftType ORDER BY ta.time_in) row
,lead(ta.time_in,1,0) over (PARTITION BY ts.time_in,ShiftType ORDER BY ta.time_in) TimeOt
from @shiftpolicy ts
inner join @attendance ta
on ta.time_in <= ts.time_out and ta.time_out >= ts.time_in
)t
)ta
--order by ShiftType desc
union
select time_out,lead from
(
select ts.time_in DefTimeIn,ts.time_out DefTimeOut,ts.ShiftType,ta.*,ROW_NUMBER() OVER(PARTITION BY ts.time_in,ShiftType ORDER BY ta.time_in) row
,lead(ta.time_in,1,0) over (PARTITION BY ts.time_in,ShiftType ORDER BY ta.time_in) lead
--,lag(ta.time_in,1,0) over (PARTITION BY ts.time_in,ShiftType ORDER BY ta.time_in)
--,last_value(ta.time_out) over(PARTITION BY ts.time_in,ShiftType ORDER BY shiftType)
from @shiftpolicy ts
inner join @attendance ta
on ta.time_in <= ts.time_out and ta.time_out >= ts.time_in
)t
)TA
where ([OUT] <> '1900-01-01 00:00:00.000' AND [IN] <> '1900-01-01 00:00:00.000') AND [out] <> '' AND [in] <> '0'
order by 1
Итак, что вы пробовали? –
Я буду обновлять вопрос по моему запросу. –
Как вы вывели «Ожидаемый результат» - тайм-аут переходит в timein и наоборот? – Abhishek