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

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

5
задан Joel Coehoorn 23 October 2008 в 16:36
поделиться

8 ответов

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
11
ответ дан 18 December 2019 в 09:55
поделиться

Я думаю, что это более чисто:

   SELECT  SUM(
               DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate()))
              ) AS ElapsedTime
   FROM Table
3
ответ дан 18 December 2019 в 09:55
поделиться

Попытка:

Select Sum(
    DateDiff(
        Minute,
        IsNull((Select Start where Start != '9999.12.31'), GetDate()),
        IsNull((Select End where End != '9999.12.31'), GetDate())
    )
)
from *tableName*
2
ответ дан 18 December 2019 в 09:55
поделиться

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

Select  Case When (Stop <> '31 Dec 9999') Then 
          DateDiff(mi, Start, Stop) 
        Else 
          DateDiff(mi, Start, GetDate()) 
        End
From    ATable
1
ответ дан 18 December 2019 в 09:55
поделиться

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

0
ответ дан 18 December 2019 в 09:55
поделиться

Используя справку из ответа 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
ответ дан 18 December 2019 в 09:55
поделиться

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. Проанализируйте это значение.

0
ответ дан 18 December 2019 в 09:55
поделиться

- можно играть с 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
0
ответ дан 18 December 2019 в 09:55
поделиться