これは合計作業時間を返します。これは、作業時間が各ブレーク時間と重複しているかどうかをチェックし、重複がどれくらいあるかを示すように変更します。
次に、休憩時間の合計を計算し、最後に作業者のパンチ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;
は、これはあまりにも厳格に見えます。休暇中に労働者が仕事をする必要がある場合はどうなりますか?上司に20分待つと教えてくれますか? –
私はそれが厳格ですが、経営陣が望んでいることに同意します。 – jdidsQAA
複数のブラックアウトとパンチインアウトが可能ですか? –