1

我有一张表,其中包含来自传感器机器的员工出勤日志,员工在一天内可以有多个 IN & OUT 条目,我想通过忽略我的 Time OUT 来计算员工留在 IN 的小时数(总工作时间)两天一直在寻找这个解决方案,但无法获得所需的结果。

日志表如下(checkin_out_log)

╔════════╦═══════╦═════════════════════════╦════════════╗
║ emp_id ║ shift ║       check_time        ║ check_type ║
╠════════╬═══════╬═════════════════════════╬════════════╣
║      2 ║     1 ║ 2018-02-22 07:00:44.000 ║ C-IN       ║
║      2 ║     1 ║ 2018-02-22 13:00:35.000 ║ B-OUT      ║
║      2 ║     1 ║ 2018-02-22 13:30:46.000 ║ B-IN       ║
║      2 ║     5 ║ 2018-02-22 16:00:55.000 ║ C-OUT      ║
╚════════╩═══════╩═════════════════════════╩════════════╝

所需的输出是:

╔════════╦══════════╦═════════════════════════╦════════════╗
║ emp_id ║  IN Hrs  ║       Date              ║ OUT HRS    ║
╠════════╬══════════╬═════════════════════════╬════════════╣
║      2 ║ 08:30    ║ 2018-01-22              ║ 00:30      ║
╚════════╩══════════╩═════════════════════════╩════════════╝

这是查询中的数据

这是我在结果中得到的结果,其中数据显示在您的查询的屏幕截图中,请指导有什么问题

4

1 回答 1

2

假设 IN 和 OUT 总是成对的。

您可以使用 LEAD() 窗口函数来获取下一个 check_time。并使用 CASE WHEN 条件来确定是 IN 还是 OUT 时间

select  emp_id, 
        in_hrs = sum(in_mins) / 60.0, 
        check_date = convert(date, check_time), 
        out_hrs = sum(out_mins) / 60.0
from
(
    select  *, 
            in_mins = CASE  WHEN    check_type in ('C-IN', 'B-IN')
                            AND     LEAD(check_type) OVER (PARTITION BY emp_id ORDER BY check_time) in ('C-OUT', 'B-OUT')
                            THEN    DATEDIFF(MINUTE, 
                                             check_time, 
                                             LEAD(check_time) OVER (PARTITION BY emp_id ORDER BY check_time))
                            ELSE    0
                            END,
            out_mins= CASE  WHEN    check_type in ('C-OUT', 'B-OUT')
                            AND     LEAD(check_type) OVER (PARTITION BY emp_id ORDER BY check_time) in ('B-IN')
                            THEN    DATEDIFF(MINUTE, 
                                             check_time, 
                                             LEAD(check_time) OVER (PARTITION BY emp_id ORDER BY check_time))
                            ELSE    0
                            END
    from    checkin_out_log
) d
group by emp_id, convert(date, check_time)

编辑:添加条件以验证 IN 没有 OUT 的情况,反之亦然。输入/输出将被忽略且不计算。

添加的条件是

LEAD(check_type) OVER (PARTITION BY emp_id ORDER BY check_time) in ('C-OUT', 'B-OUT')
于 2018-06-13T04:16:21.840 回答