求:sql中解决一个表中所有两个日期之间所有天数的语句

有一个表,表的内容如下:
住院号 姓名 开始日期 结束日期
185316 杨浩 2013/1/10 2013/1/12
192405 张鑫 2013/3/3 2013/3/4
203385 冯贺 2013/6/3 2013/6/4
想生成一个新表如下:
住院号 姓名 开始日期 结束日期 日期
185316 杨浩 2013/1/10 2013/1/12 2013/1/10
185316 杨浩 2013/1/10 2013/1/12 2013/1/11
185316 杨浩 2013/1/10 2013/1/12 2013/1/12
192405 张鑫 2013/3/3 2013/3/4 2013/3/3
192405 张鑫 2013/3/3 2013/3/4 2013/3/4
203385 冯贺 2013/6/3 2013/6/8 2013/6/3
203385 冯贺 2013/6/3 2013/6/8 2013/6/4
203385 冯贺 2013/6/3 2013/6/8 2013/6/5
203385 冯贺 2013/6/3 2013/6/8 2013/6/6
203385 冯贺 2013/6/3 2013/6/8 2013/6/7
203385 冯贺 2013/6/3 2013/6/8 2013/6/8
该怎么做呢

--从开始日期到结束日期,每天一条记录,你的冯贺截止日期是2013/6/8吧,我的是mssql
Create Table T
(
住院号 varchar(10),
姓名 varchar(10),
开始日期 datetime,
结束日期 datetime   
)
 
insert into T values('185316','杨浩','2013/1/10','2013/1/12')    
insert into T values('192405','张鑫','2013/3/3','2013/3/4')    
insert into T values('203385','冯贺','2013/6/3','2013/6/8')  

--递归查询 
With TT
As
(
Select 住院号,姓名,开始日期,结束日期,开始日期 As 日期 from T 
union all
Select 住院号,姓名,开始日期,结束日期,dateadd(day,1,日期) From TT 
Where dateadd(day,1,日期)<=结束日期 
)
Select * From TT  
Order By 住院号,日期


--这个也可以
Select t.*,DATEADD(DD,number,开始日期 ) As 日期  
From t Cross Join master.dbo.spt_values b
Where Type='P' and DATEADD(DD,number,开始日期 )<=结束日期

追问

谢谢你的解答,关键是这个表内的行数有几万个呢,怎么用语句批量生成呢

追答/*
我这个就是批量生产的啊,几万行只是运行时间长点,我上面的图只是举个例子,用游标一行一行的拆也行,反正方法多,我的代码只跟开始日期和结束日期有关,你多整点数据进去看看效果,但是开始日期到结束日期的天数大于2000左右的话,第二个写法不合适(不过你可以弄个1到n连续的表,写法如下),第一个写法如果开始日期到结束日期的天数大于100,要在最后面加option (MAXRECURSION 32767),这是最大递归次数,如果天数超过32767了,那就得用下面的代码了*/
--楼上的,明显的不是你要的结果,那个SB网友还采纳
--1.先生成一个1到N的连续整数表B
Create Table B
(
    number int
)
--数据自己插入罗
--2.得到结果
Select t.*,DATEADD(DD,number,开始日期 ) As 日期  
From t Cross Join B
Where DATEADD(DD,number,开始日期 )<=结束日期

追问

不好意思,游标我不 会用,能不能直接帮我写个完整的语句。可以直接生成我需要的表的语句呢。谢谢了

追答

With TT
As
(
Select 住院号,姓名,开始日期,结束日期,开始日期 As 日期 from T
union all
Select 住院号,姓名,开始日期,结束日期,dateadd(day,1,日期) From TT
Where dateadd(day,1,日期)<=结束日期
)
Select * From TT
Order By 住院号,日期
option (MAXRECURSION 32767)
就这个就可以了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-02-28
select datediff(dd,'2014-01-01','2014-10-01') AS [间隔天数] from 表

其中dd代表天数, '2014-01-01'代表开始日期 ,'2014-10-01'代表结束日期

本回答被网友采纳