Transact-SQL для подведения итогов прошедшего времени - PullRequest
5 голосов
/ 17 сентября 2008

В моей базе данных есть таблица с записями времени начала и окончания для конкретной задачи. Вот образец данных:

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

Я хотел бы написать скрипт, который суммирует истекшие минуты для этих временных периодов, и где бы ни находилась дата 12/31/9999, я хочу, чтобы она использовала текущую дату и время, поскольку она все еще выполняется .

Как бы я это сделал, используя Transact-SQL?

Ответы [ 8 ]

11 голосов
/ 17 сентября 2008
SELECT  SUM( CASE  WHEN Stop = '31 dec 9999' 
                   THEN DateDiff(mi, Start, Stop)
                   ELSE DateDiff(mi, Start, GetDate())
             END ) AS TotalMinutes 
FROM    task

Однако лучшим решением было бы сделать Stop field nullable, and make it null when the task is still running. That way, you could do this: </p> <pre>SELECT SUM( DateDiff( mi, Start, IsNull(Stop, GetDate() ) ) AS TotalMinutes FROM task

3 голосов
/ 26 сентября 2008

Я думаю, что это чище:

   SELECT  SUM(
               DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate()))
              ) AS ElapsedTime
   FROM Table
2 голосов
/ 17 сентября 2008

Попробуйте:

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 голос
/ 17 сентября 2008

Следующее будет работать для SQL Server, другие базы данных используют различные функции для вычисления даты и получения текущего времени.

Select  Case When (Stop <> '31 Dec 9999') Then 
          DateDiff(mi, Start, Stop) 
        Else 
          DateDiff(mi, Start, GetDate()) 
        End
From    ATable
0 голосов
/ 17 сентября 2008

Используя помощь от ответа AJ , ответа BelowNinety и ответа Nerdfest , я получил следующее:

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

Спасибо за помощь!

0 голосов
/ 17 сентября 2008

Datediff становится все труднее использовать, поскольку у вас больше различий в датах (т. Е. В вашем случае это минуты и секунды; иногда часы). К счастью, в большинстве вариантов TSQL вы можете просто выполнять математику по датам. Предполагая, что это поле даты, вы можете просто запросить:

выберите длительность = стоп - старт

Для практического примера давайте выберем разницу между двумя датами и временем, не заботясь о таблице:

выберите преобразование (дата и время, '2008-09-17 04: 56: 45.030') - преобразование (дата и время, '2008-09-17 04: 53: 05.920')

, который возвращает «1900-01-01 00: 03: 39.110», указывая, что есть ноль лет / месяцев / дней; 3 минуты, 39,11 секунды между этими двумя датами. Оттуда ваш код может TimeSpan.Parse это значение.

0 голосов
/ 17 сентября 2008

- вы можете играть с датировкой, используя mi в течение минут

- это дает вам секунду каждого задания

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

- сумма

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 голосов
/ 17 сентября 2008

Функция datediff может отображать истекшие минуты. Утверждение if для проверки от 31.12.9999 я оставлю в качестве упражнения для читателя; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...