2008-09-17 14 views
5

Ich habe eine Tabelle in meiner Datenbank die Datensätze starten und stoppen Zeiten für eine bestimmte Aufgabe. Hier ist ein Beispiel der Daten:Transact-SQL zum Aufsummieren der verstrichenen Zeit

Start      Stop 
9/15/2008 5:59:46 PM  9/15/2008 6:26:28 PM 
9/15/2008 6:30:45 PM  9/15/2008 6:40:49 PM 
9/16/2008 8:30:45 PM  9/15/2008 9:20:29 PM 
9/16/2008 12:30:45 PM  12/31/9999 12:00:00 AM 

Ich möchte ein Skript schreiben, das die verstrichene Minuten für diesen Zeitrahmen beträgt bis, und überall dort, wo ein 12/31/9999 ist Datum, ich will, es zu benutzen das aktuelle Datum und die Uhrzeit, da dies noch nicht abgeschlossen ist.

Wie würde ich dies mit Transact-SQL tun?

Antwort

11
SELECT SUM(CASE WHEN Stop = '31 dec 9999' 
        THEN DateDiff(mi, Start, Stop) 
        ELSE DateDiff(mi, Start, GetDate()) 
      END) AS TotalMinutes 
FROM task 

jedoch eine bessere Lösung wäre es, die Stop-Feld auf NULL festlegbare zu machen, und es null machen, wenn die Aufgabe noch läuft. Auf diese Weise können Sie dies tun:

SELECT SUM(DateDiff(mi, Start, IsNull(Stop, GetDate())) AS TotalMinutes 
FROM task 
0

Die datediff function kann die verstrichenen Minuten anzeigen. Die if-Anweisung für die 12/31/9999 Prüfung werde ich für den Leser als Übung lassen ;-)

0

--Sie mit dem datediff für Minuten mit mi spielen können

- das Sie zweite geben jede Aufgabe

select Start, 
     Stop, 
     CASE 
      WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate()) 
      ELSE datediff(ss, start,stop) 
     END duration_in_seconds 

from mytable 

- Summe

Select Sum(duration_in_seconds) 
from 
(
select Start, 
     Stop, 
     CASE 
      WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate()) 
      ELSE datediff(ss, start,stop) 
     END duration_in_seconds 

from mytable)x 
0

Zeitraum schwieriger wird, zu verwenden, wie Sie mehr in Ihrer Dateparts Differenz (also in Ihrem Fall haben, wie Minuten und Sekunden sieht, gelegentlich Stunden). Glücklicherweise können Sie in den meisten Variationen von TSQL einfach die Daten für die Daten berechnen. Unter der Annahme, dies ist ein Datumsfeld, können Sie wahrscheinlich nur Abfrage:

wählen Dauer = Stopp -

Ein praktisches Beispiel beginnen, lassen Sie uns den Unterschied zwischen zwei Datetimes auswählen, ohne mit einem Tisch stört:

wählen umrechnen (DatumZeit, '2008-09-17 04: 56: 45.030') - umrechnen (DatumZeit, '2008-09-17 04: 53: 05.920')

was "1900-01-01 00:03 : 39,110 ", was bedeutet, dass es null Jahre/Monate/Tage gibt; 3 Minuten, 39,11 Sekunden zwischen diesen beiden Zeitpunkten. Von dort kann Ihr Code TimeSpan.Parse diesen Wert.

2

Versuchen:

Select Sum(
    DateDiff(
     Minute, 
     IsNull((Select Start where Start != '9999.12.31'), GetDate()), 
     IsNull((Select End where End != '9999.12.31'), GetDate()) 
    ) 
) 
from *tableName* 
1

Im Folgenden wird für SQL Server umgehen, verwenden andere Datenbanken unterschiedliche Funktionen für die Datumsberechnung und die aktuelle Zeit zu bekommen.

Select Case When (Stop <> '31 Dec 9999') Then 
      DateDiff(mi, Start, Stop) 
     Else 
      DateDiff(mi, Start, GetDate()) 
     End 
From ATable 
0

Mit Hilfe von AJ answer, BelowNinety der answer und Nerdfest der answer, ich kam mit den folgenden:

Select Sum(
    Case When End = '12/31/9999 12:00:00 AM' Then 
     DateDiff(mi, Start, Getdate()) 
    Else 
     DateDiff(mi, Start, End) 
    End) As ElapsedTime 
From Table 

Danke für die Hilfe!

3

Ich denke, das sauberer ist:

SELECT SUM(
       DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate())) 
      ) AS ElapsedTime 
    FROM Table 
Verwandte Themen