2012-09-12 46 views
5

可能重复:
SQL Server 2008 Generate a Series of date times在SELECT语句循环在MS SQLSERVER

我通过的startDate和结束日期

SELECT语句应该产生的结果必须循环..预计产量:

------------ 
Date 
------------ 
09/01/2012 -> startDate 
09/02/2012 
09/03/2012 
. 
. 
. 
. 
09/30/2012 -> endDate 

我试图

declare @startDate datetime , @endDate endDate 
set @startDate='09/01/2012' 
set @endDate='09/30/2012' 

while DATEDIFF(@startDate,@endDate)!=-1 
begin 
select @startDate as Date 
set @startDate = DATEADD(day,2,@startDate) 
end 

但它不工作了..

它产生30个输出..

我想在一个单一的输出的日期作为预期的输出。 。

我在哪里错了?

回答

10

这会给你一个每次循环迭代的结果集,因为你每次迭代select

如果你想有一个单独的结果插入到每个迭代一个临时表/变量然后从中选择或

;with T(day) as 
(
    select @startDate as day 
     union all 
    select day + 1 
     from T 
     where day < @endDate 
) 
select day as [Date] from T 
+0

非常感谢你.. – Dreamer

0

你可以最终创建一个临时表中的值,然后从,后迭代。

declare @temp table (TheDate date) 

declare @startDate datetime , @endDate datetime 
set @startDate='09/01/2012' 
set @endDate='09/30/2012' 

while DATEDIFF(day, @startDate, @endDate)!=-1 
begin 
insert into @temp (thedate) values (@startDate) 
set @startDate = DATEADD(day,2,@startDate) 
end 
select * from @temp 

编辑:热膨胀系数亚历克斯的建议是国际海事组织做一个更清洁的方式,更多的SQL的方式来做到这一点,而无需使用循环或游标。

2

如果你想使用一个WHILE循环:

declare @startDate datetime , @endDate datetime 
set @startDate='09/01/2012' 
set @endDate='09/30/2012' 

create table #temp (startDate datetime) 

while @startDate <= @endDate 
    begin 
     insert into #temp 
     select @startDate as Date 
     set @startDate = DATEADD(day,1,@startDate) 
    end 

select * 
from #temp 

drop table #temp 

看到SQL Fiddle with Demo

+0

感谢和sqlfiddle的不错.. – Dreamer