-3

私はこれを表にしました:

id  dateFrom   hours
1  2013-02-01   6
2  2013-04-01   8

hours、その日付から始まる 1 か月の時間を表し、次のレコードまで有効です。

2 つの日付の間の月の時間を合計する方法を知る必要があります。

たとえば、範囲の日付が2013-02-01から2013-06-01の場合:

6hs for february +
6hs for march +
8hs for april + 
8hs for may +
8hs for june
========
36 hs
4

3 に答える 3

4
DECLARE @startDate DATE
DECLARE @endDate DATE

SET @startDate = '20130201'
SET @endDate   = '20130601'

;WITH CTE_Months AS 
(
    SELECT @startDate DT
    UNION ALL
    SELECT DATEADD(MM,1,DT) FROM CTE_Months  
    WHERE DATEADD(MM,1,DT) <= @endDate
)
,CTE_RN AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY DT ORDER BY dateFrom DESC) RN
    FROM CTE_Months m
    LEFT JOIN Table1 t ON m.DT >= t.dateFrom 
)
SELECT SUM(hours) 
FROM CTE_RN WHERE RN = 1

最初の再帰 CTE は 2 つの日付間のギャップを見つけることです。2 番目の CTE は実際のテーブルを使用ROW_NUMBERJOINて各月の時間を見つけます。最後は合計するだけWHERE RN=1

SQLFiddle デモ

于 2013-07-19T13:23:29.183 に答える