Here is another way without looping. It requires a "numbers" table. I coded a runtime numbers table but you could pre-create one if you don't already have one.create table #t (id int, admission_date datetime, discharge_date datetime)insert #t values (1 ,'2007-11-01' ,'2007-11-03')insert #t values (2 ,'2007-11-13' ,'2007-11-14')select dateadd(day, numbers.n, admission_date) as [date] ,t.[id] as [id]from (--any table of numbers select n1+n2+n3+n4 as n from (select 0 n1 union select 1) n1 cross join (select 0 n2 union select 2) n2 cross join (select 0 n3 union select 4) n3 cross join (select 0 n4 union select 8) n4 ) numbersjoin #t t on datediff(day, t.admission_date, t.discharge_date) >= numbers.norder by 2, 1drop table #toutput:date id ------------------------------------------------------ ----------- 2007-11-01 00:00:00.000 12007-11-02 00:00:00.000 12007-11-03 00:00:00.000 12007-11-13 00:00:00.000 22007-11-14 00:00:00.000 2
Be One with the OptimizerTG