1

次の形式のテーブルがあります。

StartDate[date], EndDate[date], HoursPerWeek[int]

そして、このように少し満たされています:

StartDate  |   EndDate  | HoursPerWeek
01/01/2010 | 31/12/2010 | 37
01/01/2010 | 31/03/2010 | 16
05/03/2010 | 31/10/2010 | 9

私が作成する必要があるのは、特定の日付範囲での労働時間数の週ごとの内訳を示す表です。

理想的には、これをlinq to sqlで実行しますが、ストアドプロシージャを呼び出す必要がある場合は問題ありません。私はこれを実装する方法について最初の手がかりを本当に持っていません。

どうすればこれを始めることができますか?

アップデート

私はこれをストアプロシージャとして作成することになりましたが、これは機能しますが、私の目にはきれいな解決策ではありません。

CREATE PROCEDURE prcGetHoursWorked
(
    @StartDate DATE,
    @EndDate DATE
)
AS

CREATE TABLE #Results
(
    WeekStart DATE,
    TotalHours INT
)

DECLARE @WeekOffset INT
DECLARE @FirstDayOfStartWeek DATE
DECLARE @HoursThisWeek INT

SET @WeekOffset = 0
SET @FirstDayOfStartWeek = dbo.fnc_StartOfWeek(@StartDate, 2);

WHILE (DATEDIFF(wk, @StartDate, @EndDate) > @WeekOffset)
BEGIN
    SELECT @HoursThisWeek = SUM(HoursPerWeek) FROM StaffCost
    WHERE NOT (
                Start> DATEADD(wk, @WeekOffset + 1, @FirstDayOfStartWeek) 
                OR 
                [End] < DATEADD(wk, @WeekOffset, @FirstDayOfStartWeek)
            )

    INSERT INTO #Results
    VALUES(DATEADD(wk, @WeekOffset, @FirstDayOfStartWeek), @HoursThisWeek)

    SET @WeekOffset = @WeekOffset + 1
END

SELECT * FROM #Results

これをセットベースの操作として実行することは可能ですか、それともlinqからsqlに直接実行する方がよいでしょうか?

4

1 に答える 1

0

出力がどのように見えるかを理解できているかどうかわかりません。しかし、それで提案をやめさせないようにします。

カレンダー テーブルを作成すると、通常、このようなクエリを簡単に表現できます。しかし、あなたが探しているものはそうではないかもしれません。(下記参照。)

select c.cal_date as week_end, c.iso_year, c.iso_week, 
       sum(hoursperweek) as hours_this_week
from st
inner join calendar c on (c.cal_date >= startdate and 
                          c.cal_date <= enddate and 
                          c.day_of_week = 'Sun')
group by week_end, iso_year, iso_week
order by week_end

これが出力の一部です。トリミングしました。

week_end     iso_year   iso_week  hours_this_week
--
2010-01-03   2009       53        53
...
2010-02-21   2010        7        53
2010-02-28   2010        8        53
2010-03-07   2010        9        62
2010-03-14   2010       10        62
2010-03-21   2010       11        62
2010-03-28   2010       12        62
2010-04-04   2010       13        46
2010-04-11   2010       14        46
...

以前、基本的なカレンダー テーブル(PostgreSQL 構文) のコードを SO に投稿しました。ISO の週と年は含まれません。必要に応じて、後で完全なコードをここに投稿します。私に知らせて。

このクエリが実行しない 2 つのこと

比例配分時間を計算しようとしません。たとえば、サンプル入力の最後の行の開始日は 2010-03-05 です。その日付は、2010 年 3 月 1 日から 2010 年 3 月 7 日までの ISO 第 9 週に当たります。私が書いたクエリは、ISO 第 9 週の 9 時間のうち 3/7 を計算しようとしません。

暦と一致しません。ISO の週番号は、カレンダーの表に既に含まれていたので便利でした。独自のカレンダー テーブルを作成する場合は、好きなように定義できます。

于 2011-04-26T23:57:41.137 に答える