0

この共通テーブル式があります

WITH total_hour
AS (
    SELECT 
      employee_id,
      SUM(ROUND(CAST(DATEDIFF(MINUTE, start_time, finish_time) AS NUMERIC(18, 0)) / 60, 2)) AS total_h
    FROM Timesheet t
    WHERE t.employee_id = @employee_id
      AND DENSE_RANK() OVER (
        ORDER BY DATEDIFF(DAY, '20130925', date_worked) / 7 DESC ) = @rank
    GROUP BY t.personnel_id
    )

これはサンプルデータです:

ID  employee_id     worked_date     start_time      finish_time
 1     1          2013-09-25        09:00:00    17:30:00        
 2     1          2013-09-26        07:00:00    17:00:00    
 8     1          2013-10-01        09:00:00    17:00:00    
 9     1          2013-10-04        09:00:00    17:00:00    
 12    1          2013-10-07        09:00:00    17:00:00    
 13    1          2013-10-30        09:00:00    17:00:00    
 14    1          2013-10-28        09:00:00    17:00:00    
 15    1          2013-11-01        09:00:00    17:00:00

水曜日が週の最初の日で、基準日が 2013-09-25 であるとします。@rank が 1 の場合は 09-25 から 10-01 までの合計労働時間数を取得し、@rank=2 の場合は 10-02 から 10-08 までの合計時間を取得したいと考えています。

ありがとう

4

1 に答える 1

1

特定の週に従業員が働いた時間数を取得するには、適切な WHERE 基準を使用するだけです。これには、DENSE_RANK や同様のウィンドウ関数を使用する必要はありません。

整数を含む @Week パラメータがあると仮定します (現在の週は 0、先週は 1、その前の週は 2 など)。

SELECT
    employee_id
    SUM(ROUND(CAST(DATEDIFF(MINUTE, start_time, finish_time) AS NUMERIC(18, 0)) / 60, 2)) AS total_h
FROM
    Timesheet t
WHERE
    t.employee_id = @employee_id AND
    date_worked BETWEEN DATEADD(ww, DATEDIFF(ww,0,GETDATE()) - @Week, 0)
                    AND DATEADD(ww, DATEDIFF(ww,0,GETDATE()) - @Week, 0) + 7

ここでは、現在の日付 ( GETDATE()) を基準日として使用していますが、必要に応じて に置き換えることもでき20130925ます。

于 2013-10-07T12:09:20.437 に答える