2010-09-06 70 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 ...