2016-12-21 3 views
1

Ich habe eine Tabelle mit Datenzeilen, die ein StartTime (DATETIME) -Feld enthalten. Es gibt eine Reihe von Daten für jede Minute für ungefähr das letzte Jahr. Ich möchte eine Möglichkeit zum Ausführen eines Skripts zum Aktualisieren des StartTime-Felds, so dass die Zeitstempel "aktuell" sind (das sind Demodaten für eine Webanwendung).Alle Zeitstempel mit winzigen Intervallen aktualisieren

Meine Idee war, ROW_NUMBER() und DATEADD() zu verwenden, um jede Zeile mit einem neuen Zeitstempel zu aktualisieren, beginnend mit der aktuellen Zeit vor einem Jahr, und eine Minute pro Zeile durchlaufen.

Die Idee schien für eine SELECT-Anweisung zu arbeiten:

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; 

die erwarteten Zeitstempel getrennt um eine Minute produziert:

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

Aber wenn ich das gleiche Konzept mit einer UPDATE-Anweisung versuchen:

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 

Alle Zeitstempel, die aktualisiert werden, sind dann gleich:

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

Warum funktioniert das nicht? Wie kann ich alle Zeilen so aktualisieren, dass Zeitstempel um eine Minute getrennt sind?

+2

Wie hängen die Tabellen in Ihrem Update zusammen? Es sieht so aus, als ob alle Zeilen in TEST mit allen Werten aus dem CTE aktualisiert werden, wobei nur die letzte Aktualisierung in der Spalte StartTime gespeichert wird. – Steven

+0

@Steven Test ist die einzige Tabelle (keine Relationen). Ich möchte jede Zeile aktualisieren, so dass jeder Zeitstempel unterschiedlich ist, zeitlich um eine Minute getrennt. – mtmacdonald

+0

In welcher Reihenfolge wird die TEST-Tabelle aktualisiert? – Steven

Antwort

5

@Steven hat Recht - derzeit aktualisieren Sie alle Zeilen in Test mit dem letzten Wert im CTE. Sie müssen die Zeile aktualisiert wird in der Test Tabelle zu dem entsprechenden Betrag in der WAK assoziieren:

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 richtig weisen darauf hin, Sie haben nicht explizit die zwischen DataRows und Test verbinden definiert.

@ Strickt01 bietet ein schönes Beispiel, wie dies erreicht werden kann.

Hier ist eine alternative Syntax, die zeigt, dass Sie die FROM-Klausel nicht immer benötigen, wenn Sie eine CTE mit einer UPDATE query kombinieren.

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 
; 
Verwandte Themen