如何为每一行增加DateTime列一秒?

Som*_*ody 1 sql sql-server sql-server-2000

假设我有这个时间值: 09:00:00

我有一个列有Time列的表,我有三个记录.

我希望用这个时间更新这3条记录,但每次增加一秒钟的时间值(对于每条记录).

像这样的东西:

ColumnA   ColumnB
1         09:00:00
2         09:00:01
3         09:00:02
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我的解决方案

经过一段时间研究我自己的解决方案,这就是我想出的

update tor1
set ColumnB = dateadd(s,tor2.inc, ColumnB)
from table1 tor1
inner join (select ColumnA, ROW_NUMBER() OVER (Order by ColumnA) as inc from table1) tor2 on tor1.ColumnA=tor2.ColumnA
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 8

您没有指定任何特定的顺序.

对于不确定/未记录的结果,您可以尝试古怪的更新方法.

CREATE TABLE table1
(
    ColumnB datetime NULL
);

INSERT INTO table1 DEFAULT VALUES;
INSERT INTO table1 DEFAULT VALUES;
INSERT INTO table1 DEFAULT VALUES;

DECLARE @ColumnB datetime;

SET @ColumnB = '19000101 09:00:00';

UPDATE table1
SET @ColumnB = ColumnB = DATEADD(s, 1, @ColumnB);

SELECT *
FROM table1;

DROP TABLE table1;
Run Code Online (Sandbox Code Playgroud)

否则你需要使用光标或ROW_NUMBER在2000年找到一些模拟方法.


Aar*_*and 5

这是一个使用 #temp 表但不使用不受支持的古怪更新(没有冒犯 Martin)并且不依赖于无法保证的神奇身份排序的版本(没有冒犯 Richard)。

CREATE TABLE dbo.Whatever
(
  ColumnA INT IDENTITY(1,1), 
  ColumnB DATETIME
);

INSERT dbo.Whatever(ColumnB) SELECT '09:00';
INSERT dbo.Whatever(ColumnB) SELECT '09:00';
INSERT dbo.Whatever(ColumnB) SELECT '09:00';
INSERT dbo.Whatever(ColumnB) SELECT '09:00';
INSERT dbo.Whatever(ColumnB) SELECT '09:00';

-- just to demonstrate a gap
DELETE dbo.Whatever WHERE ColumnA = 3;

SELECT w.ColumnA, w.ColumnB, 
  c = (SELECT COUNT(*) FROM dbo.Whatever WHERE ColumnA < w.ColumnA)
INTO #x
 FROM dbo.Whatever AS w;

UPDATE w
  SET ColumnB = DATEADD(SECOND, x.c, w.ColumnB)
  FROM dbo.Whatever AS w
  INNER JOIN #x AS x
  ON x.ColumnA = w.ColumnA;

SELECT ColumnA, ColumnB FROM dbo.Whatever;
Run Code Online (Sandbox Code Playgroud)

结果:

ColumnA  ColumnB
-------  -----------------------
1        1900-01-01 09:00:00.000
2        1900-01-01 09:00:01.000
4        1900-01-01 09:00:02.000
5        1900-01-01 09:00:03.000
Run Code Online (Sandbox Code Playgroud)