2008-09-17 19 views
5

Mam tabelę w mojej bazie danych czas rozpoczęcia i zakończenia rekordów dla określonego zadania. Oto przykład danych:Transact-SQL podsumowujący upływ czasu

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 

Chciałbym napisać skrypt, który wynosi obecnie Upływający minut na tych ramach czasowych, a tam, gdzie jest to data 12/31/9999, chcę go użyć bieżąca data i godzina, ponieważ to wciąż trwa.

Jak to zrobić, używając języka Transact-SQL?

Odpowiedz

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

Jednak lepszym rozwiązaniem byłoby, aby Zatrzymaj pól pustych, i sprawiają, że wartość null, gdy zadanie jest jeszcze uruchomiony. W ten sposób, można to zrobić:

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

Urządzenie datediff function może wyświetlić upłynięte minuty. If do sprawdzenia 12/31/9999 zostawię jako ćwiczenie dla czytelnika ;-)

0

--you może grać z wykorzystaniem mil na DateDiff minut

- To daje sekund każdego zadania

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 

- suma

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

DateDiff staje się coraz trudniejsze w obsłudze, jak masz więcej dateparts w różnicy (czyli w twoim przypadku wygląda minutach i sekundach, czasem godzina). Na szczęście w większości odmian TSQL można po prostu wykonywać matematykę w terminach. Zakładając, że jest to pole data, można chyba tylko zapytania:

wybierz czas trwania = zatrzymanie - start

Dla praktycznego przykładu, załóżmy zaznaczyć różnicę między dwoma datetimes nie dbając przy stole:

wybierz convert (datetime, "2008-09-17 04: 56: 45.030") - convert (datetime, "2008-09-17 04: 53: 05.920")

, który zwraca "1900-01-01 00:03 : 39.110 ", co wskazuje na zero lat/miesięcy/dni; 3 minuty, 39,11 sekund między tymi dwoma datetami. Stamtąd twój kod może TimeSpan.Parse tej wartości.

2

Spróbuj:

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

Poniższa będzie pracować dla SQL Server, baz danych wykorzystują różne inne funkcje do obliczania dat i uzyskanie aktualnego czasu.

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

Korzystanie z pomocy AJ answer, wpadłem BelowNinety na answer i Nerdfest na answer z następujących czynności:

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 

Dzięki za pomoc!

3

myślę, że to jest czystsze:

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