2017-10-25 4 views
0

これがユニークな質問かどうかはわかりません。TSQL - パンチ間の時間を計算しますが、中断時間は除外します

私は労働者追跡システムのためにパンチインとパンチアウトの時間を計算する必要があります。私たちのクルーは10時から20時まで、そして1時から20時まで休憩しています。

私が把握する必要があるのは、これらのブレーク中にまだパンチインされている場合、この時間を合計から差し引く方法です。例えば

、ジョーは10時23分に出て9時53分で仕事にパンチとパンチならば、私はそれが10分の代わりに、私はいくつかの「停電のためにこれを行うことができますどのように30

を表示したいです「10-10:20,1-1:20,11-11:20、および5-5:20の時間」を意味する。

+1

は、これはあまりにも厳格に見えます。休暇中に労働者が仕事をする必要がある場合はどうなりますか?上司に20分待つと教えてくれますか? –

+0

私はそれが厳格ですが、経営陣が望んでいることに同意します。 – jdidsQAA

+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; 
関連する問題