不确定这是否是一个独特的问题。
我需要为计算机跟踪系统计算出打卡时间和打卡时间。我们的工作人员在上午10-10:20和下午1-1:20休息。
我需要弄清楚的是,如果在这些休息期间仍被打孔,如何从总数中减去这个时间。
例如,如果Joe在09:53进入工作并在10:23发出冲击,我希望它显示10分钟而不是30分钟。
我怎么能在10-10:20,1:20,11-11:20和5-5:20的几次“停电”时间这样做?
答案 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;