sql查询 - 获取刷卡之间的差异时间 - 向员工扫出

时间:2012-07-06 11:42:31

标签: sql sql-server sql-server-2008

我有一张这样的表

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为“Swipe-IN”,EX为“Swipe OUT”)

我想找出在给定时间内在办公室中度过最长时间的EMPID。 所以我的输入将是开始时间和结束时间(例如:2012-06-01 12:30和2012-06-05 18:30)。

请注意以下三个条件:

  1. 可能有员工在此之前就职 帧。在这种情况下,我们必须考虑滑动为 该员工的时间框架的开头。

  2. 对于在时间范围之后退出的员工,刷卡时间将是时间范围的结束。

  3. 如果员工的刷卡时间小于时间范围且刷卡时间大于时间范围,那么全部 这些empID应显示为结果

  4. 最好的方法是什么?是否可以使用单个查询?

1 个答案:

答案 0 :(得分: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