これは私があなたの「ファクトテーブル」がどのように見えるかを想像するものです:
declare @dt datetime
set @dt = '7-1-2012'
;
with date_table as (
select @dt as [Start Date],
dateadd(d,-1,dateadd(mm,1,@dt)) as [End Date],
datepart(d,dateadd(d,-1,dateadd(mm,1,@dt))) as [Days]
union ALL
select dateadd(mm, 1, [Start Date]) as [Start Date],
dateadd(d,-1,dateadd(mm,1,dateadd(mm, 1, [Start Date]))) as [End Date],
datepart(d,dateadd(d,-1,dateadd(mm,1,dateadd(mm, 1, [Start Date])))) as [Days]
from date_table
where dateadd(mm, 1, [Start Date]) <= dateadd(m,500,@dt))
select [Start Date], [End Date], [Days]
into #temp
from date_table
option (MAXRECURSION 0)
これは日付を選択しています。(これらのステートメントにDATEADDまたはDATEPARTが含まれていないことに注意してください)
select finish.[Start Date], finish.[End Date], finish.[Days]
from (select rownum
from (select [Start Date], [End Date], [Days], row_number() over (order by [Start Date]) as rownum
from #temp) as x
where x.[Start Date] = '2012-07-01 00:00:00.000' ) as start
join (select [Start Date], [End Date], [Days],
row_number() over (order by [Start Date]) as rownum
from #temp) as finish
on finish.rownum = start.rownum + 360
以下のコメントを読みます...日数などを要約しようとしている場合は、これがどのようにできるかです:(したがって、2012年7月1日から360か月間...date_diff_daysの結果は次のようになります。 360か月の合計日数...私が作成した#tempテーブルを使用しています...これはあなたのファクトテーブルに似ていると思います...私は10957日を得ました)
select sum(dayscount.[Days]) as date_diff_days
from (select rownum
from (select [Start Date], [End Date], [Days], row_number() over (order by [Start Date]) as rownum
from #temp) as x
where x.[Start Date] = '2012-07-01 00:00:00.000' ) as start
join (select [Start Date], [End Date], [Days],
row_number() over (order by [Start Date]) as rownum
from #temp) as finish
on finish.rownum = start.rownum + 360
join (select [Start Date], [End Date], [Days],
row_number() over (order by [Start Date]) as rownum
from #temp) as dayscount
on dayscount.rownum >= start.rownum and
dayscount.rownum < finish.rownum