-2

我有一张这样的桌子

swipe_details

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)。

请注意这三个条件:

  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 回答