2010-09-06 131 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代碼在這裏... END將增加 – 2010-09-06 08:58:02

+0

一個例子可能有所幫助... 原始日期:01/04/1984, 01/05/1984,01/06/1984 新日期:01/04/1984,01/06/1984,01/08/1984 – paulio 2010-09-06 09:00:12

回答

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'來爲每個ID「重置」。例如... [日期] 01/04/1984 [編號] 1 [RN] 1,[日期] 01/05/1984 [編號] 1 [RN] 2,[日期] 01/06/1984 [編號] 1 [RN] 3.其後爲[日期] 01/10/1984 [身份證] 2 [RN] 1,[日期] 01/11/1984 [身份證] 2 [RN] 2,[日期] 01/12/1984 [ID] 2 [RN] 3 – paulio 2010-09-06 12:33:56

+0

@paulio - 請參閱編輯。您可以通過使用'PARTITION BY [ID]' – 2010-09-06 12:38:47

+0

Super來重置行號,這正是我一直在尋找的。謝謝你的幫助。 – paulio 2010-09-06 13:46:08

0

這應該工作,但只有當您的表中的每個原始日期是唯一的。我已經調用了列mydate,因爲我不認爲date是列的合法(或明智)名稱。如果你有某種ID列,這可能會更容易,更安全。那麼我們將使用遊標,而不是日期

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 ...