假设我有此时间值:09:00:00
我有一个列有Time列的表,我有三个记录。
我希望用这个时间更新这3条记录,但每次时间值增加一秒(对于每条记录)。
这样的事情:
ColumnA ColumnB
1 09:00:00
2 09:00:01
3 09:00:02
我该怎么做?
我的解决方案:
经过一段时间研究我自己的解决方案,这就是我提出的
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
答案 0 :(得分:7)
您没有指定任何特定的顺序。
对于不确定/未记录的结果,您可以尝试使用古怪的更新方法。
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;
否则你需要使用光标或在2000年找到模拟ROW_NUMBER
的方法。
答案 1 :(得分:4)
这里有一个使用#temp表的版本,但没有使用不受支持的古怪更新(没有犯罪马丁)并且不依赖于神奇的身份排序,这是不能保证的(没有冒犯)理查德)。
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;
结果:
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
答案 2 :(得分:2)
如果您认为ColumnA
是您需要添加的秒数(或者与您的示例成正比),那么您可以使用它。
UPDATE myTable SET ColumnB = DATEADD(s, (ColumnA - 1), ColumnB)
如果没有,您需要确定每个专栏的排名(谷歌上的大量结果)并添加排名。
答案 3 :(得分:0)
对于SQL Server 2005及更高版本,您可以使用OVER子句来控制更新的顺序。
;with T as (
select *, rn=row_number() over (order by columnA)
from Tbl)
update T
set columnB = DateAdd(s, rn-1, '09:00:00');
对于SQL Server 2000,您可以使用临时表。使用INSERT INTO..SELECT to guarantee计算IDENTITY列。
CREATE TABLE table1
(
ColumnA int,
ColumnB datetime NULL
);
INSERT INTO table1 values (1, null);
INSERT INTO table1 values (2, getdate());
INSERT INTO table1 values (3, '02:02:02');
create table #tmp (ColumnA int, ID int identity(0,1))
insert into #tmp
select ColumnA
from table1
order by ColumnA;
update a
set ColumnB = dateadd(s,t.ID,'09:00:00')
from #tmp t
join table1 a on a.ColumnA = t.ColumnA;
select * from table1;