不确定这是不是一个独特的问题。
我需要为劳动力跟踪系统计算打卡和打卡时间。我们的工作人员从上午10点到10点20分和下午1点到1点20分休息。
我需要弄清楚的是,如果他们在这些休息期间仍然打卡,如何从总数中减去这一次。
例如,如果Joe在09:53上班,10:23下班,我希望它显示为10分钟,而不是30分钟。
我怎么能在10-10:20、1-1:20、11-11:20和5-5:20这几个“停电”时间内做到这一点呢?
发布于 2017-10-26 03:13:44
此函数返回工作分钟总数。此检查工作时间是否与每个休息时间重叠,然后更改它以指示重叠程度。
然后计算休息的总分钟数,最后减去工人打孔in_out的总时间。
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;
https://stackoverflow.com/questions/46939626
复制相似问题