2010-09-06 2 views
0

Я пытаюсь увеличить время между датами на установленную сумму. Например, я хочу добавить два месяца в период между датой 1,2 и 3. У меня возникли проблемы увеличивающейся мой «Дата счетчик» ...Приращение счетчика для dateadd

DECLARE @monthDiff int 

SET @monthDiff = 1; 

UPDATE [Table1] 
SET [Date] = DATEADD(MONTH, (SET @monthDiff = @monthDiff + 1), [Date]) 
WHERE [ID] IN 
(
    SELECT [ID] 
    FROM [Table2] 
    WHERE [Description] = 'HE' 
); 

Пример может помочь ...

Оригинальные даты:

01/04/1984 
01/05/1984 
01/06/1984 

Новые даты:

01/04/1984 
01/06/1984 
01/08/1984 

Любые идеи?

Я использую SQLServer 2005.

Спасибо.

+0

Я не конечно, что вы пытаетесь сделать здесь, как правило, WHILE @monthDiff <3 BEGIN ..DATEADD CODE ЗДЕСЬ ... END будет работать для увеличения –

+0

Пример может помочь ... Оригинальные даты: 01/04/1984, 01/05/1984, 01/06/1984 Новые даты: 01/04/1984, 01/06/1984, 01/08/1984 – paulio

ответ

1
;WITH cte AS 
(
SELECT t1.ID, 
     t1.[Date], 
     ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY [Date]) AS RN 
FROM Table1 t1 
JOIN Table2 t2 
ON t1.ID = t2.ID 
WHERE t2.[Description] = 'HE' 
) 
UPDATE CTE 
SET [Date] = DATEADD(MONTH, RN-1, [Date]) 
+0

Это почти то, что мне нужно, за исключением того, что мне нужен «RowNumber» для «сброса» для каждого идентификатора. Например ... [Дата] 01/04/1984 [ID] 1 [RN] 1, [Дата] 01/05/1984 [ID] 1 [RN] 2, [Дата] 01/06/1984 [ID] 1 [RN] 3. Затем следуют [Дата] 01/10/1984 [ID] 2 [RN] 1, [Дата] 01/11/1984 [ID] 2 [RN] 2, [Дата] 01/12/1984 [ID] 2 [RN] 3 – paulio

+0

@paulio - см. Раздел «Редактирование». Вы можете сбросить номер строки, используя 'PARTITION BY [ID]' –

+0

Супер, именно это я и искал. Спасибо за вашу помощь. – paulio

0

это должно работать, хотя только если каждая оригинальная дата в вашем столе уникальна. Я назвал mydate столбца, потому что я не думаю, что дата является законным (или разумным) именем для столбца. Это может быть проще и безопаснее, если у вас есть какой-то идентификатор. то мы будем использовать, что для курсора, а не на дату

declare @numberOfMonthsToAdd int 
declare @currentDate dateTime 
set @numberOfMonthsToAdd = 0 
declare myCursor cursor for 
select [mydate] from Table1 
open myCursor 
while @@fetch_Status<>-1 
begin 
fetch next from myCursor into @currentDate 
update Table1 set [mydate] = DATEADD(month,@numberOfMonthsToAdd, [mydate]) where [mydate] = @currentDate 
set @numberOfMonthsToAdd = @numberOfMonthsToAdd + 1 

end 
close mycursor 
deallocate mycursor 
0

Из вашего примера, кажется, вы хотите изменить даты относительно даты основания:

declare @basedate datetime 
select @basedate = min([Date]) FROM Table1 WHERE ... 

UPDATE [Table1] 
SET [Date] = DATEADD(MONTH, DATEDIFF(MONTH, @basedate, [Date]) * 2, [Date]) 
WHERE ... 
Смежные вопросы