5

可能重复:
SQL Server 2008 生成一系列日期时间

我必须遍历 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个输出..

我希望单个输出中的日期与预期输出中的一样。

伙计们,我哪里错了?

4

3 回答 3

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
于 2012-09-12T15:27:09.800 回答
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

于 2012-09-12T15:31:44.583 回答
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

编辑:cte Alex 建议是 imo 一种更清洁的方法,更多的是一种 sql 方法,无需使用循环或游标。

于 2012-09-12T15:31:07.620 回答