日期:2014-05-17  浏览次数:20355 次

SQL高手请进,如能解决给高手!
数据库有数据
id   beginDate    endDate
1    2013-08-01   2013-08-04


查询出结果、可用函数等等

id    Date
1     2013-08-01
1     2013-08-02
1     2013-08-03
1     2013-08-04

请高手多多指教。
SQL

------解决方案--------------------
CREATE TABLE #temp(id INT, beginDate DATETIME, endDate DATETIME)
INSERT #temp SELECT 1, '2013-08-01', '2013-08-04'

SELECT
a.id,
[Date] = CONVERT(CHAR(10), DATEADD(DAY, number, beginDate), 120)
FROM #temp a
CROSS APPLY
(
SELECT TOP(DATEDIFF(DAY, A.beginDate, A.endDate)+1) number 
FROM MASTER..spt_values 
WHERE type ='p'
ORDER BY number
) b

/*
id Date
1 2013-08-01
1 2013-08-02
1 2013-08-03
1 2013-08-04
*/

------解决方案--------------------

select 
    a.id,convert(varchar(10),dateadd(d,b.number,a.beginDate),120) as Date
from 你的表名 a 
left join master..spt_values b on b.type='p'
where dateadd(d,b.number,a.beginDate)<=a.[endDate]

------解决方案--------------------
楼主,注意了:楼上的方法都有局限性了,两个日期之间最好不要相隔2048天了,否则就出现BUG了

SELECT COUNT(*) FROM  master..spt_values b WHERE  b.TYPE='p'
--2048

declare @t TABLE
([id] int,[beginDate] datetime,[endDate] datetime)
insert @t
select 1,'1900-01-01','2013-08-06'

select 
a.id,
CONVERT(VARCHAR(10),DATEADD(d,b.number,a.beginDate),120) AS Date
from @t a 
LEFT JOIN master..spt_values b ON 1=1 AND b.TYPE='p'
WHERE DATEADD(d,b.number,a.beginDate)<=a.[endDate]
--此例最多只能找到 1905-08-10



------解决方案--------------------