2016-09-26 21 views
0

私は予約済みの処理DATETIMEフィールドを特定の時間に開始したい場所に約10,000レコードあります。テーブルのdatetimeフィールドを更新し、毎回秒を追加する

私は、すべてのレコードを2秒間の開始日時に追加するまで、日付の秒を特定の時刻に更新し、次のレコードを前の日時に2秒追加します。

すなわち 行1の日付1 2016年9月26日18:27:50.000 行2の日付2 2016年9月26日18:27:52.000 行3のDate3 2016年9月26日18:27:54.000

whileループでこれを行うことはできますか?

create table #secondsiterate (procdate datetime) 
insert into #secondsiterate (procdate) 
select GETDATE() 

WHILE (just want to add 2 seconds to each date field until it is done) 
BEGIN 
UPDATE #secondsiterate set procdate = DATEADD(ss,2,procdate) 
END; 
+0

おそらく、(select *、row_number(over order by(select null)) - myTableから1 n)のT update procdate = dateadd(second、n * 2、procdate)のようなものでしょうか?つまり、あなたはwhileループでそれを行うことができますが、それは不要と思われます。 – ZLK

答えて

1

あなたがテーブル「MyTableという」で「DateColumn」を更新しようとしていると仮定すると、あなたが行を取得するかを決定するためにソートするために使用することができますテーブルの列「OrderColumnは」(それがDateColumnではありません)がありますどのような値、その後、次のSQLはあなたが望むことをする必要があります。

DECLARE @startDate datetime; 
SELECT @startDate = GETDATE(); -- Set this however you wish 
UPDATE x 
    SET DateColumn = DATEADD(SS, 2*rn, @startDate) 
    FROM (SELECT *, (ROW_NUMBER() OVER (ORDER BY orderColumn)) AS rn FROM YourTable) x 

あなたはあなたのテーブルのいずれかから現在の日付に... @startDate変数を設定する(示すように)または多分DateColumnのMAXまたはMIN日付にする...あなたはあなたのアプリケーションのために必要が必要です。

WHILEおよびFORループを回避する秘訣は、副選択またはCTE(共通表式)でROW_COUNT()を使用することです。これにより、反復ループやカーソルよりも高速かつ効率的なセット操作を使用できます。

関連する問題