2010-01-15 7 views
1

Я пытаюсь заполнить таблицу на основе двух и трехнедельных интервалов для полумесячного периода оплаты в TSQL. В таблице следует заполнить,TSQL Выбор интервалов 2 и 3 недели

2 week date 
2 week date 
3 week date 
2 week date 
2 week date 
3 week date 

..based на первом свидании я поставить, затем добавление 2 или 3 недели до даты последнего из комплекта поставки. Я должен иметь возможность указать дату начала и дату окончания. Может быть, это только рано утром, но не может придумать элегантный способ выполнить эту задачу. Любые указатели?

Спасибо! George

+0

'DATEADD (WK, 2, @yourDate)'? –

+0

Это добавит статические 2 недели к каждому периоду. Мне нужно, чтобы он чередовался между 2-2-3-2-2-3 –

ответ

1

Horrid перебор подход - поскольку 2,2,3 трудно петли просто добавив его независимо в временную таблицу и затем фильтруют в конце упаковывают пару лишних записей идти - не самый эффективный, но если вам нужно просто выбрать диапазон, то он работает.

Так предостережение здесь: нормально для одного отключения, я не стал бы использовать в производстве :)

declare @start datetime 
declare @end datetime 
declare @calculated datetime 

set @start = '20010101' 
set @end = '20011231' 

set @calculated = @start 

Create Table #Dates (PayDate datetime) 

while @calculated <= @end 
begin 
    set @calculated = DateAdd(wk,2,@calculated) 
    insert into #Dates(paydate) values (@calculated) 
    set @calculated = DateAdd(wk,2,@calculated) 
    insert into #Dates(paydate) values (@calculated) 
    set @calculated = DateAdd(wk,3,@calculated) 
    insert into #Dates(paydate) values (@calculated) 
end 
select * from #Dates where paydate >= @start and paydate <= @end 
drop table #dates 
+0

Не для prod, просто для предварительной записи данных. ;) –

0

Итак, у вас есть 7-недельный цикл - выясните, какой 7-недельный период вы находитесь в какой-то известной отправной точке, а затем на той неделе этой группы из 7 человек.

3
WITH dates (d, n) AS 
     (
     SELECT @mydate, 1 
     UNION ALL 
     SELECT DATEADD(week, CASE n % 3 WHEN 0 THEN 3 ELSE 2 END, d), n + 1 
     FROM dates 
     WHERE d < @enddate 
     ) 
INSERT 
INTO mytable 
SELECT d 
FROM dates 
OPTION (MAXRECURSION 0) 
+0

Спасибо - не мог заставить это работать правильно. Бросил кучу ошибок. Цените это, хотя! :) –

+0

+1 за изобретательность использования CTE для ее решения - мне это нравится. – Andrew

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