Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. 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
Попытка:
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
Функция datediff может отобразить прошедшие минуты. Если оператор для 31.12.9999 проверяет, что я уеду как осуществление в читателя ;-)
Используя справку из ответа 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
Спасибо за справку!
Datediff становится более трудным использовать, поскольку у Вас есть больше dateparts в Вашем различии (т.е. в Вашем случае, похож на минуты и секунды; иногда часы). К счастью, в большинстве изменений TSQL, можно просто выполнить математику в даты. Принятие этого является полем даты, можно, вероятно, просто запросить:
выберите продолжительность =, остановка - запускается
Для практического примера давайте выберем различие между двумя datetimes, не беспокоясь таблицей:
избранное преобразование (дата и время, '17.09.2008 4:56:45.030') - преобразовывает (дата и время, '17.09.2008 4:53:05.920')
который возвращается "01.01.1900 0:03:39.110", указывая, что существуют нулевые годы/месяцы/дни; 3 минуты, 39,11 секунд между этими двумя datetimes. Оттуда, Ваш код может TimeSpan. Проанализируйте это значение.
- можно играть с datediff использование ми в течение многих минут
- это дает Вам второй из каждой задачи
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