2015-12-18 3 views
1

нужно создать временную таблицу, которая заполняется на основе двух параметров:Loop на основе значения параметра

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

Временная таблица должна иметь столбец, который будет захватывать YYYYMM за все годы и месяц, которые между @Start и @End.

Вот что у меня есть. Я хочу, чтобы остановить его на 201412, а затем начать снова 201501. Вместо этого петля продолжает идти в приросте плюс 1 (я не хочу видеть 201413..so на):

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 

ответ

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

+1

Это отлично работает. – NonProgrammer

Смежные вопросы