我的表名为 EmpLog
Id - 主键
EmpID - 员工代码。 //示例N100,N101,N200
状态 - 输入/输出
ActionDateTime - 日期时间。 IN或OUT日志条目的确切出现。
我想用特定的Date执行存储过程。 它应该返回表中每个employeeid的工作小时总数的结果。
我们可能在所选日期为同一名员工提供多个IN / OUT。
查看输出格式图像Expected Output result
如果缺少任何输入/输出应该显示给该员工。例如,所选日期的奇数IN或OUT条目应显示缺少IN或Out。
如果没有IN和Out,则应显示N / A
答案 0 :(得分:1)
假设每个IN都有适当的OUT并按顺序排列,那么您可以在SQL Server 2012中使用滞后来实现如下所示:
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 |
+---------+----------------+