我想将日期范围划分为各个月份。 例如-我有一个以以下方式包含数据的视图:
user project startdate enddate ----------------------------------- A abc1 2011-01-01 2011-12-31 A abc2 2011-01-01 2011-05-01 B xyz1 2011-01-01 2011-03-01
我希望能够以这种方式显示以上数据:
user project startdate enddate A abc1 2011-01-01 2011-01-31 A abc1 2011-02-01 2011-02-28 A abc1 2011-03-01 2011-03-31 ---------------------------------- A abc2 2011-01-01 2011-01-31 A abc2 2011-02-01 2011-02-28 ---------------------------------- B xyz1 2011-01-01 2011-01-31 B xyz1 2011-02-01 2011-02-28 B xyz1 2011-03-01 2011-03-31
有人可以帮我吗?
下面的查询应该可以解决问题。该CTE(该WITH条款)动态生成一些月份的数据,我们可以使用它来加入反对。
CTE
WITH
declare @test table ( userid char(1), project char(4), startdate datetime, enddate datetime) insert into @test select 'A', 'abc1', '1/1/2011', '12/31/2011' union select 'A', 'abc2', '1/1/2011', '5/1/2011' union select 'B', 'xyz1', '1/1/2011', '3/1/2011' --select * from @test ;with MonthList as ( select DATEADD(month, M, '12/1/1899') as 'FirstDay', dateadd(day, -1, dateadd(month, M + 1, '12/1/1899')) as 'LastDay', DATEADD(month, M + 1, '12/1/1899') as 'FirstDayNextMonth' from ( select top 3000 ROW_NUMBER() over (order by s.name) as 'M' from master..spt_values s) s ) select t.userid, t.project, ml.FirstDay, ml.LastDay from @test t inner join MonthList ml on t.startdate < ml.FirstDayNextMonth and t.enddate >= ml.FirstDay