2015-03-31 38 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