У меня есть таблица в моей базе данных, в которой время начала и окончания записи для конкретной задачи. Вот образец данных:
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?


функция 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
Думаю, это чище:
SELECT SUM(
DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate()))
) AS ElapsedTime
FROM Table