在ms sqlserver中的SELECT语句中循环

时间:2012-09-12 15:20:28

标签: sql sql-server

  

可能重复:
  SQL Server 2008 Generate a Series of date times

我必须遍历startDate和endDate

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个输出..

我希望单个输出中的日期与预期输出中的日期相同。

我在哪里错了?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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方式,而不使用循环或游标。