我有一张这样的表
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)。
请注意以下三个条件:
可能有员工在此之前就职 帧。在这种情况下,我们必须考虑滑动为 该员工的时间框架的开头。
对于在时间范围之后退出的员工,刷卡时间将是时间范围的结束。
如果员工的刷卡时间小于时间范围且刷卡时间大于时间范围,那么全部 这些empID应显示为结果
最好的方法是什么?是否可以使用单个查询?
答案 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