-2

このようなテーブルがあります

スワイプ詳細

EMPID   EVENT_TYPE   Swipe_time
1       EN           2012-06-01 12:00
1       EX           2012-06-01 12:30
2       EN           2012-06-01 12:50
1       EN           2012-06-01 13:10
2       EX           2012-06-01 13:30
2       EN           2012-06-01 14:00
2       EX           2012-06-01 19:00
1       EX           2012-06-01 19:30

基本的に従業員のスワイプの詳細を保存します(ENは「スワイプイン」、EXは「スワイプアウト」)

特定の時間枠でオフィスにいる時間が最も長い EMPID を見つけたい。したがって、入力は開始時刻と終了時刻になります (例: 2012-06-01 12:30 と 2012-06-05 18:30)。

次の 3 つの条件にも注意してください。

  1. 時間枠の前にオフィスに入った従業員がいる可能性があります。この場合、スワイプをその従業員の時間枠の開始と見なす必要があります。

  2. 時間枠の後に終了する従業員の場合と同様に、スワイプアウトの時間は時間枠の終わりになります。

  3. スワイプイン時間が時間枠より短く、スワイプアウト時間が時間枠より長い従業員がいる場合、これらすべての empID を結果として表示する必要があります。

それを行う最良の方法は何ですか?単一のクエリで可能ですか?

4

1 に答える 1

3
select    empid,
          sum
          (
              datediff
              (
              MINUTE, 
              case when timesheet.timein < @timeframe_start 
                  then @timeframe_start  
                  else timesheet.timein end, 
              case when timesheet.timeout > @timeframe_end 
                  then @timeframe_end 
                  else timesheet.timeout end
              )
          ) as total_duration
from     (
         select    timein.empid, 
                   timein.swipe_time as timein, 
                   timeout.swipe_time as timeout
         from      tbltest timein
         left join tblTest timeout 
         on        timein.empid = timeout.empid
         and       timeout.eventtype = 'ex'
         and       timeout.swipe_time = 
             (
             select     MIN(swipe_time) 
             from       tblTest tcheck 
             where      tcheck.empid = timeout.empid 
             and        tcheck.eventtype = 'EX' 
             and        tcheck.swipe_time > timein.swipe_time
             )
         where      timein.eventtype = 'en'
         ) timesheet
where    timesheet.timein between @timeframe_start and @timeframe_end
or       timesheet.timeout between @timeframe_start and @timeframe_end
or       (
         timesheet.timein < @timeframe_start 
         and timesheet.timeout > @timeframe_end
         )
group by empid
order by 2 desc
于 2012-07-06T12:05:53.527 に答える