2

この Time 値があるとします。09:00:00

Time 列のテーブルがあり、そこには 3 つのレコードがあります。

その時間でこれらの 3 つのレコードを更新したいのですが、Time 値は毎回 1 秒ずつ (レコードごとに) 増加します。

このようなもの:

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
4

4 に答える 4

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;

ROW_NUMBERそれ以外の場合は、カーソルを使用するか、2000でシミュレートする方法を見つける必要があります。

于 2013-03-28T22:05:28.583 に答える
5

これは、#temp テーブルを使用するバージョンですが、サポートされていない風変わりな更新を使用せず (Martin の違反ではありません)、保証されていない魔法の ID 順序付けに依存していません (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;

結果:

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
于 2013-03-28T22:28:39.810 に答える
3

ColumnA追加する必要がある秒数(または例のように正比例)であると想定できる場合は、それを使用できます。

UPDATE myTable SET ColumnB = DATEADD(s, (ColumnA - 1), ColumnB)

そうでない場合は、各列のランクを決定し (そのために Google で多数の結果が得られます)、代わりにランクを追加する必要があります。

于 2013-03-28T21:56:01.443 に答える
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 フィドル

SQL Server 2000 では、一時テーブルを使用できます。INSERT INTO..SELECT を使用して、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;
于 2013-03-28T22:02:14.203 に答える