【问题标题】:Loop based on parameter value基于参数值的循环
【发布时间】:2015-12-18 19:37:31
【问题描述】:

我需要创建一个基于两个参数填充的临时表:

declare @Start date = '01/01/2015'
declare @End date = '12/31/2015'

临时表应该有一个列,该列将捕获 @Start 和 @End 参数之间的所有年份和月份的 YYYYMM。

这是我目前所拥有的。我想在 201412 停止它,然后在 201501 重新开始。相反,这个循环一直以加 1 递增(我不想看到 201413..等等):

declare @Start date = '01/01/2014'
declare @End date = '12/31/2015'

declare @monthstart as int
declare @monthend as int
declare @increment as int

set @monthstart = (SELECT LEFT(CONVERT(varchar, @Start,112),6))
set @monthend = (SELECT LEFT(CONVERT(varchar, @End,112),6))

create table #datetemp  (RelevantYYYYMM int)
insert into #datetemp values (@monthstart)
set @increment = @monthstart


While @increment < @monthend
BEGIN 
set @increment = (select Max(RelevantYYYYMM) + 1 from #datetemp)
insert into #datetemp values (@increment)
set @increment = (select Max(RelevantYYYYMM) from #datetemp)
IF (select Max(RelevantYYYYMM) from #datetemp) > @monthend
Break
else 
continue
END

select * from #datetemp

【问题讨论】:

    标签: sql-server-2008 loops if-statement while-loop


    【解决方案1】:

    您可以使用计数表并避免循环:

    CREATE TABLE #datetemp (RelevantYYYYMM INT);
    
    DECLARE @Start DATE = '01/01/2015', @End DATE = '12/31/2015';
    
    WITH tally_table AS
    (
      SELECT TOP 1000 rn = ROW_NUMBER() OVER(ORDER BY name) - 1
      FROM master..spt_values
    )
    INSERT INTO #datetemp(RelevantYYYYMM)
    SELECT LEFT(CONVERT(varchar, DATEADD(month, rn, @Start),112),6)
    FROM tally_table
    WHERE YEAR(DATEADD(month, rn, @Start)) <= YEAR(@End)
      AND MONTH(DATEADD(month, rn, @Start)) <= MONTH(@End)
    
    SELECT *
    FROM #datetemp;
    

    LiveDemo

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多