私はカレンダー表はここではまったく適切なツールではないと思います。連続した日付が欲しいので、集計表は良い方法のようです。
まずデータを設定しましょう。
declare @Something table
(
NAME varchar(10)
, ID varchar(10)
, DateFrom date
, THRU date
)
insert @Something values
('Bob', 'A123', '20101030', '20101102')
, ('Bob', 'B567', '20101030', '20101102')
次に、集計表が必要です。私は自分のシステム上のビューとして1つを保持しており、それは0回の読み込みで高速に膨れ上がっています。必要に応じて行数を自由に調整してください。
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
今、あなたの状況に対する問い合わせはとても簡単です。
select s.Name
, s.ID
, s.DateFrom
, s.THRU
, DOS = DATEADD(day, t.N - 1, DateFrom)
from @Something s
join cteTally t on t.N <= datediff(day, DateFrom, THRU) + 1
order by s.Name
, s.ID
, t.N