Transact-SQL для подсчета прошедшего времени

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

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

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

Как мне это сделать с помощью Transact-SQL?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
5
0
14 170
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

функция dateiff может отображать прошедшие минуты. Оператор if для проверки 31/12/9999 я оставлю в качестве упражнения для читателя ;-)

- вы можете поиграть с dateiff, используя 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

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

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

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

выберите convert (datetime, '2008-09-17 04: 56: 45.030') - convert (datetime, '2008-09-17 04: 53: 05.920')

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

Пытаться:

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

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

Select  Case When (Stop <> '31 Dec 9999') Then 
          DateDiff(mi, Start, Stop) 
        Else 
          DateDiff(mi, Start, GetDate()) 
        End
From    ATable
Ответ принят как подходящий

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:

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

Используя помощь отвечать AJ, отвечать LowerNinety и отвечать 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

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

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

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

Другие вопросы по теме