2016-12-21 6 views
1

私はStartTime(DATETIME)フィールドを含むデータ行を持つテーブルを持っています。昨年のおよそ1分間のデータ行があります。タイムスタンプが「最近」(これはウェブアプリケーションのデモデータ)になるようにStartTimeフィールドを更新するスクリプトを実行する方法が必要です。細かい間隔ですべてのタイムスタンプを更新する

私の考えは、ROW_NUMBER()およびDATEADD()を使用して、各行を新しいタイムスタンプで更新し、1年前の現在の時刻から開始し、1行あたり1分を反復することでした。 1分で区切られ、予想されるタイムスタンプ生成

SELECT TOP 10 
DATEADD(MINUTE,ROW_NUMBER() OVER (Order by StartTime),DATEADD(yy, -1, GETDATE())) AS Ds 
FROM Test WHERE ItemId='0E0814B9-79A0-4BCF-AB33-B89D84CA3BEC' ORDER BY StartTime; 

アイデアは、SELECT文のために働くように見えた

2015-12-21 17:57:55.550 
2015-12-21 17:58:55.550 
2015-12-21 17:59:55.550 

をしかし、私はUPDATEステートメントを使用して、同じ概念をしようとすると:

WITH Datarows (Ds) 
AS 
( 
    SELECT DATEADD(MINUTE,ROW_NUMBER() OVER (Order by StartTime),DATEADD(yy, -1, GETDATE())) AS Ds 
    FROM Test 
    WHERE ItemId='0E0814B9-79A0-4BCF-AB33-B89D84CA3BEC' 
) 
UPDATE Test 
SET StartTime = Ds 
FROM Datarows 

更新されるタイムスタンプはすべて同じです:

2015-12-21 17:30:14.463 
2015-12-21 17:30:14.463 
2015-12-21 17:30:14.463 

なぜこれが機能しないのですか?タイムスタンプを1分で区切るために、すべての行をどのように更新できますか?

+2

アップデートでは、どのようにテーブルが関連していますか? TESTのすべての行がCTEのすべての値で更新され、最後の更新のみがStartTime列に格納されているようです。 – Steven

+0

@Steven Testは唯一のテーブルです(関係なし)。それぞれのタイムスタンプが異なるように各行を更新し、1分ごとに分けていきたいと思います。 – mtmacdonald

+0

TESTテーブルを更新する順序は何ですか? – Steven

答えて

5

@Stevenが正しい - 現在、Testのすべての行がCTEの最終値で更新されています。あなたはCTEの同等にTestテーブルで更新された行を関連付ける必要があります。

WITH Datarows (TestId, Ds) 
AS 
( 
    -- Where TestId is the primary key of the test table 
    SELECT TestId, DATEADD(MINUTE,ROW_NUMBER() OVER (Order by StartTime),DATEADD(yy, -1, GETDATE())) AS Ds 
    FROM Test 
    WHERE ItemId='0E0814B9-79A0-4BCF-AB33-B89D84CA3BEC' 
) 
UPDATE Test 
SET StartTime = Ds 
FROM Test t 
INNER JOIN DataRows d 
ON d.TestId = t.TestId 
3

@Stevenは正しく、あなたが明示的にデータローとテストの間の結合定義していないと指摘します。

@ Strickt01は、これをどのように実現できるかの良い例を示しています。

これは代替の構文です。これは、CTEUPDATE queryを組み合わせるときに必ずFROMという句が必要なわけではないことを示しています。

WITH Datarows AS 
    ( 
     SELECT 
      StartTime, 
      DATEADD(MINUTE,ROW_NUMBER() OVER (Order by StartTime),DATEADD(yy, -1, GETDATE())) AS Ds 
     FROM 
      Test 
     WHERE 
      ItemId='0E0814B9-79A0-4BCF-AB33-B89D84CA3BEC' 
    ) 
UPDATE 
    Datarows 
SET 
    StartTime = Ds 
; 
関連する問題