SQL SERVER使用Multiple IN和OUT及其详细信息计算总工作时间

时间:2017-05-18 22:02:21

标签: sql sql-server stored-procedures time-and-attendance

我的表名为 EmpLog

EmpLog表

  1. ID
  2. EMPID
  3. 状态
  4. ActionDateTime
  5. Id - 主键

    EmpID - 员工代码。 //示例N100,N101,N200

    状态 - 输入/输出

    ActionDateTime - 日期时间。 IN或OUT日志条目的确切出现。

    Click for table structure

    我想用特定的Date执行存储过程。 它应该返回表中每个employeeid的工作小时总数的结果。

    我们可能在所选日期为同一名员工提供多个IN / OUT。

    查看输出格式图像Expected Output result

    如果缺少任何输入/输出应该显示给该员工。例如,所选日期的奇数IN或OUT条目应显示缺少IN或Out。

    如果没有IN和Out,则应显示N / A

1 个答案:

答案 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 |
+---------+----------------+