あなたはこのCTEを使用した年のあなたの文字列をbulidすることができます。
DECLARE @STARTYEAR varchar(10) = '2006-12-25'
DECLARE @ENDYEAR varchar(10) = '2013-11-14'
;with CTE as
(
select datepart(year, @STARTYEAR) as yr, CAST(datepart(year, @STARTYEAR) AS VARCHAR(MAX)) as c
union all
select yr + 1 as yr, CAST(concat(c, ',', yr+1) AS VARCHAR(MAX)) as c
from CTE
where yr < datepart(year, @ENDYEAR)
)
select yr, c
from CTE
where (yr = datepart(year, @ENDYEAR))
ここでは、StartYearとEndYearがDBテーブルから取得されます。
create table #yr (id int, start varchar(20), stop varchar(20))
insert into #yr values(1,'2005-01-01','2010-12-10'), (2,'2008-01-01','2011-12-10'), (3,'2007-01-01','2013-12-10'), (4,'2009-01-01','2012-10-10')
;with CTE as
(
select start as start, datepart(year, start) as yr, CAST(datepart(year, start) AS VARCHAR(MAX)) as c from #yr
union all
select CTE.start as start, yr + 1 as yr, CAST(concat(c, ',', yr+1) AS VARCHAR(MAX)) as c
from CTE join #yr on #yr.start = CTE.start
where yr < datepart(year, stop)
)
select id, #yr.start, #yr.stop, c
from CTE join #yr on #yr.start = CTE.start
where (yr = datepart(year, stop))
次の結果
4 2009-01-01 2012-10-10 2009,2010,2011,2012
3 2007-01-01 2013-12-10 2007,2008,2009,2010,2011,2012,2013
2 2008-01-01 2011-12-10 2008,2009,2010,2011
1 2005-01-01 2010-12-10 2005,2006,2007,2008,2009,2010
で一つは、カラム内の区切られたリストを保存することはほとんどないはずです、なぜ開始/終了年は自分自身では十分ではありませんか? –
私の結果を得るには後でフィルターを使う必要があるからです。私は別のプロセスを作成するために、その間に結果が必要です。 –
したがって、列にピボットさせたい行を照会してから列ストリングをフィルターに掛けるのですか?しかし、単に行をフィルタリングするだけではないのですか? –