2015-03-31 59 views
0

我需要更新我的表的前1000行中的一列(類型datetime)。然而,美中不足的是與每個附加行,我必須遞增GETDATE() 1秒...像DATEADD(ss,1,GETDATE())更新表,每行有新值

我知道如何做到這一點的唯一方法是這樣的:

UPDATE tablename 
    SET columnname = CASE id 
         WHEN 1 THEN DATEADD(ss,1,GETDATE()) 
         WHEN 2 THEN DATEADD(ss,2,GETDATE()) 
         ... 
        END 

顯然,這是不合理。有任何想法嗎?

+0

您可以編寫一個遞增GETDATE值 – 2015-03-31 18:03:19

+0

@JimSosa自定義函數雅這就是我想的......我在SSIS中這樣做,所以這很容易。只是想看看是否有一個很酷的小竅門,我可以在查詢中做到這一點 – 40Alpha 2015-03-31 18:04:58

+0

你試過了DateAdd(ss,id,getDate())。假設你的ID都是1的增量 – 2015-03-31 18:07:22

回答

1

我不知道你的ID是,我假設你至少有SQL Server 2008或其他ROW_NUMBER()將不起作用。

注:我做了前2名,告訴你,你的頂級作品。您可以將其更改爲您的實際查詢的前1000位。

DECLARE @table TABLE (ID int, columnName DATETIME); 
INSERT INTO @table(ID) 
    VALUES(1),(2),(3); 

UPDATE @table 
SET columnName = DATEADD(SECOND,B.row_num,GETDATE()) 
FROM @table A 
INNER JOIN 
      (
      SELECT TOP 2 *, ROW_NUMBER() OVER (ORDER BY ID) row_num 
      FROM @table 
      ORDER BY ID 
      ) B 
ON A.ID = B.ID 


SELECT * 
FROM @table 

結果:

ID   columnName 
----------- ----------------------- 
1   2015-03-31 13:11:59.760 
2   2015-03-31 13:12:00.760 
3   NULL 
3

如何使用id而不是一個常數?

UPDATE tablename 
    SET columnname = DATEADD(second, id, GETDATE()) 
    WHERE id <= 1000; 

如果你想第1000行(由id),但id有缺口或其他問題,那麼你可以使用一個CTE

with toupdate as (
     select t.*, row_number() over (order by id) as seqnum 
     from tablename 
    ) 
update toupdate 
    set columnname = dateadd(second, seqnum, getdate()) 
    where seqnum <= 1000; 
-2

這應該是你所需要的(至少一個理念爲指導)

DELIMITER $$ 
CREATE PROCEDURE ADDTIME() 

BEGIN 
    DECLARE i INT Default 1 ; 
    simple_loop: LOOP   
    UPDATE tablename SET columnname = DATE_ADD(NOW(), INTERVAL i SECOND) where rownumber = i 
    SET i=i+1; 
    IF i=1001 THEN 
     LEAVE simple_loop; 
    END IF; 
    END LOOP simple_loop; 
END $$ 

要調用存儲過程使用

CALL ADDTIME()

+1

你在用什麼語言? – Stephan 2015-03-31 18:45:47

+0

這是一個mysql循環語句。他沒有指定他使用的數據庫,這就是爲什麼我說這是一個指導原則。 – njupnlugd 2015-03-31 20:48:54

+0

雖然標籤說sql-server ... – Stephan 2015-03-31 20:55:07

-1

您並未明確指出您正在使用的SQL Server版本,因此我將假設SQL Server 2005或更高版本。我相信WAITFOR DELAY命令將是一個不錯的選項,可以爲datetime列的每行添加1秒。

見這個例子:

-- Create temp table 
CREATE TABLE #Client 
( 
    RecordID int identity(1,1), 
    [Name] nvarchar(100) not null, 
    PurchaseDate datetime null 
) 

-- Fill in temp table with example values 
INSERT INTO #Client 
VALUES ('Jhon', NULL) 

INSERT INTO #Client 
VALUES ('Martha', NULL) 

INSERT INTO #Client 
VALUES ('Jimmy', NULL) 


-- Create local variables 
DECLARE @currentRecordId int, 
     @currentName nvarchar(100) 

-- Create cursor 
DECLARE ClientsCursor CURSOR FOR 
SELECT RecordID, 
     [Name] 
FROM #Client 

OPEN ClientsCursor 

FETCH FROM ClientsCursor INTO @currentRecordId, @currentName 

-- Check @@FETCH_STATUS to see if there are any more rows to fetch. 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    UPDATE #Client 
    SET  PurchaseDate = DATEADD(ss,1,GETDATE()) 
    WHERE RecordID = @currentRecordId 
    AND  [Name] = @currentName 

    WAITFOR DELAY '00:00:01.000' 

    FETCH NEXT FROM ClientsCursor INTO @currentRecordId, @currentName 

END 

CLOSE ClientsCursor; 
DEALLOCATE ClientsCursor; 

SELECT * 
FROM #Client 

而這裏的結果:

1 Jhon 2015-03-31 15:20:04.477 
2 Martha 2015-03-31 15:20:05.473 
3 Jimmy 2015-03-31 15:20:06.470 

希望你找到這個答案有幫助

+1

沒有必要使用遊標來進行像這樣的更新。由於這應該更新「第一個」1000行,因此您的代碼需要1000秒才能運行。這是一個需要16分鐘以上的時間延長的更新。 – 2015-03-31 18:37:57