【问题标题】:Looping in SELECT statement in ms sqlserver [duplicate]在ms sqlserver中循环SELECT语句[重复]
【发布时间】:2012-09-12 15:20:28
【问题描述】:

可能重复:
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 个输出..

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

伙计们,我哪里错了?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这将为您提供每次循环迭代的结果集,就像您在每次迭代中 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
    

    【讨论】:

      【解决方案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

      【讨论】:

      • 感谢和 sqlfiddle 很好..
      【解决方案3】:

      您可以为这些值创建一个临时表,并在迭代之后最终从中进行选择。

      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 方式来执行此操作,而无需使用循环或游标。

      【讨论】:

        猜你喜欢
        • 2013-08-07
        • 1970-01-01
        • 2017-05-02
        • 2018-10-19
        • 2019-08-31
        • 2018-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多