5

重複の可能性:
SQLServer2008は一連の日時を生成します

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が提案するのは、ループやカーソルを使用せずに、それを行うためのよりクリーンな方法であり、それを行うためのより多くのSQL方法です。

于 2012-09-12T15:31:07.620 に答える