-1

我有一个表名作为EmpLog

EmpLog 表

  1. ID
  2. EmpId
  3. 地位
  4. 行动日期时间

Id - 主键

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

状态 - 输入/输出

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

点击查看表结构


我想执行具有特定日期的存储过程。它应该返回表中每个employeeid 的总工作时间的结果。

在选定的日期,我们可能有同一员工的多个 IN/OUT。

查看输出格式图像预期的输出结果

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

如果没有 IN 和 Out 它应该显示 N/A

4

1 回答 1

1

假设每个 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 |
+---------+----------------+
于 2017-05-18T22:56:04.187 回答