2017-02-16 3 views
0

У меня есть таблица один, как показано ниже:Сравнение двух таблиц и выбор значения, отсутствующие в таблице 1 (в зависимости от времени)

TimeIn  TimeOut 
------------------- 
07:30  12:30 
13:30  16:30 

У меня таблица два, как показано ниже:

TimeIn  TimeOut 
------------------- 
07:00  07:06 
07:10  08:30 
08:45  12:45 
13:55  15:30 
16:15  16:50 

таблица один политика перехода сотрудника и вторая таблица - это время обслуживания сотрудника.

Хотелось бы узнать, на какие тайминги этот сотрудник находился снаружи в часы смены политики?

Ожидаемый результат:

TimeIn  TimeOut 
------------------- 
08:30  08:45 
13:30  13:55 
15:30  16:15 

Запрос я пытался, который не работает:

SELECT InTime AS TimeIn, OutTime AS TimeOut FROM HR.GetRegisterList(@EmpId, @Date) 
EXCEPT 
SELECT FromTime AS TimeIn, ToTime AS TimeOut FROM HR.GetEmployeeDateShiftDetails(@EmpId, @Date) 
+0

Итак, что вы пробовали? –

+0

Я буду обновлять вопрос по моему запросу. –

+0

Как вы вывели «Ожидаемый результат» - тайм-аут переходит в timein и наоборот? – Abhishek

ответ

0

Ниже фрагмент кода должен делать свою работу, я должен был сделать изменения в Shift Policytable - добавлено columnShiftType -

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 

 Смежные вопросы

  • Нет связанных вопросов^_^