TSQL - 计算打孔之间的时间但排除中断时间

时间:2017-10-25 18:27:27

标签: sql-server-2008 tsql

不确定这是否是一个独特的问题。

我需要为计算机跟踪系统计算出打卡时间和打卡时间。我们的工作人员在上午10-10:20和下午1-1:20休息。

我需要弄清楚的是,如果在这些休息期间仍被打孔,如何从总数中减去这个时间。

例如,如果Joe在09:53进入工作并在10:23发出冲击,我希望它显示10分钟而不是30分钟。

我怎么能在10-10:20,1:20,11-11:20和5-5:20的几次“停电”时间这样做?

1 个答案:

答案 0 :(得分:1)

这返回工作分钟总数。检查工作时间是否与每个中断时间重叠,然后更改它以指示重叠程度。

然后计算休息时间的总分,最后减去工作时间in_out的总时间。

<强> SQL DEMO

WITH time_off as (
    SELECT * ,
           CASE WHEN w.in_w < b.out_b AND w.out_w > b.in_b
                THEN 'overlap' 
           END as overlap,
           CASE WHEN w.in_w < b.in_b 
                THEN b.in_b
                ELSE w.in_w
           END as break_start,
           CASE WHEN w.out_w > b.out_b 
                THEN b.out_b
                ELSE w.out_w
           END as break_end       
    FROM workers w
    CROSS JOIN breaks b
), break_total as (
    SELECT worker_id, in_w, out_w, SUM (CASE WHEN overlap = 'overlap'
                                             THEN datediff(minute, break_start,break_end)
                                             ELSE 0
                                        END) as break_total
    FROM time_off
    GROUP BY worker_id, in_w, out_w
)
SELECT worker_id,
       datediff(minute, in_w, out_w) - break_total as total_minutes
FROM  break_total 

对于某些调试,请执行以下操作:

SELECT * FROM time_off;
SELECT * FROM break_total;