假设每个 IN 都有适当的 OUT 并且按顺序排列,那么您可以在 SQL Server 2012 中使用 lag 来获得如下信息:
select empcode, sum(hrs) as TotalWorkHours from (
select *,Hrs = datediff(MINUTE,ActionDate, lag(ActionDate, 1, ActionDate) over(partition by empcode order by ActionDate desc))/60.0 from employee
where statuses = 'in'
) a
group by empcode
示例输入查询:
create table employee (id int identity(1,1), empcode int, [statuses] varchar(5), ActionDate datetime)
insert into employee ( empcode, statuses, ActionDate) values
(2,'in', dateadd(hour, -20, getdate()) )
, (2,'out', dateadd(hour, -19, getdate()))
, (2,'in', dateadd(hour, -18, getdate()) )
, (2,'out', dateadd(hour, -17, getdate()))
, (2,'in', dateadd(hour, -12, getdate()) )
, (2,'out', dateadd(hour, -10, getdate()))
, (3,'in', dateadd(hour, -9, getdate()) )
, (3,'out', dateadd(hour, -6, getdate()) )
, (3,'in', dateadd(hour, -4, getdate()) )
, (3,'out', dateadd(hour, -1, getdate()) )
此要求的输出:
+---------+----------------+
| empcode | TotalWorkHours |
+---------+----------------+
| 2 | 8.000000 |
| 3 | 5.000000 |
+---------+----------------+