2010-09-06 10 views
0

J'essaie d'augmenter le délai entre les dates d'un montant défini. Par exemple, je veux ajouter deux mois au temps écoulé entre la date 1,2 et 3. Je vais avoir du mal à incrémenter mon « compteur de date » ...Incrémentation d'un compteur pour 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' 
); 

Un exemple pourrait aider ...

dates originales:

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

nouvelles dates:

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

Toutes les idées? J'utilise SQLServer 2005.

Merci.

+0

Je ne suis pas Assurez-vous que ce que vous essayez de faire ici, généralement un PASSANT @monthDiff <3 BEGIN ..DATEADD CODE ICI ... END va travailler à incrémenter –

+0

Un exemple pourrait aider ... Date d'origine: 01/04/1984, 01/05/1984, 01/06/1984 Nouvelles dates: 01/04/1984, 01/06/1984, 01/08/1984 – paulio

Répondre

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

C'est presque ce dont j'ai besoin, sauf que j'ai besoin de 'RowNumber' pour 'réinitialiser' pour chaque ID. Par exemple ... [Date] 01/04/1984 [ID] 1 [RN] 1, [Date] 01/05/1984 [ID] 1 [RN] 2, [Date] 01/06/1984 [ID] 1 [RN] 3. Suivi par [Date] 01/10/1984 [ID] 2 [RN] 1, [Date] 01/11/1984 [ID] 2 [RN] 2, [Date] 01/12/1984 [ID] 2 [RN] 3 – paulio

+0

@paulio - Voir Modifier. Vous pouvez réinitialiser le numéro de ligne en utilisant 'PARTITION BY [ID]' –

+0

Super c'était exactement ce que je cherchais. Merci de votre aide. – paulio

0

Cela devrait fonctionner, mais seulement si chaque date d'origine dans votre tableau est unique. J'ai appelé la colonne mydate car je ne pense pas que la date soit un nom légal (ou sensé) pour une colonne. Cela pourrait être plus facile et plus sûr si vous avez une sorte de colonne d'identification. alors nous utiliser pour le curseur plutôt que la date

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

votre exemple, il semble que vous voulez changer les dates par rapport à une date de base:

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

UPDATE [Table1] 
SET [Date] = DATEADD(MONTH, DATEDIFF(MONTH, @basedate, [Date]) * 2, [Date]) 
WHERE ... 
Questions connexes