我需要在表格的前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 :(得分: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;
答案 1 :(得分: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
答案 2 :(得分:-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
希望您觉得这个答案很有帮助
答案 3 :(得分:-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
()