2012-09-12 16 views
5

Duplicar posibles:
SQL Server 2008 Generate a Series of date timesbucle de instrucción SELECT de SQL Server ms

tengo a través de un bucle startDate y endDate

La instrucción SELECT debe producir como resultado como ..

Resultado previsto:

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

Traté

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 

Pero no es hacer ejercicio ..

genera 30 salidas ..

quiero las fechas en una sola salida como en la salida esperada.

donde me estoy equivocando aquí chicos?

Respuesta

10

Eso le dará un conjunto de resultados para cada iteración de bucle como select por iteración.

Si desea un solo conjunto de resultados insertar en una tabla temporal/variable por iteración a continuación, seleccione de ella o

;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

muchas gracias .. gracias – Dreamer

0

Se puede crear una tabla temporal para los valores y seleccione de que, al final, después de la iteración.

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 

edición: El CTE Alex sugiere es imo de una manera mucho más limpio que hacerlo, y más de una forma de SQL para hacerlo, sin el uso de bucles o cursores.

2

Si desea utilizar un bucle 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 

ver SQL Fiddle with Demo

+0

y sqlfiddle en buen .. – Dreamer

Cuestiones relacionadas