我個人很喜歡爲這種事情理貨表。這是t-sql的瑞士軍刀。
我爲此在我的系統上創建了一個視圖。如果你不想創建一個視圖,你可以隨時輕鬆地使用這些ctes,你需要一個理貨表。
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
現在我們只需要您的示例數據在表中。
創建表#Projects ( 項目INT ,開始日期時間 ,結束日期日期時間 )
插入#Projects 選擇1, '1/1/2015', '2015年3月1日' 工會全部 選擇2,'2/1/2015','4/1/2015'
在這裏,我們到了真正的問題,這是檢索您的信息。通過示例數據和視圖,這變得非常簡單。
select p.*
, NewMonth = DATEADD(MONTH, t.N - 1, p.Start)
from #Projects p
join cteTally t on t.N <= DATEDIFF(MONTH, p.Start, p.EndDate) + 1
order by p.Project
, t.N