SQL: получить DATEDIFF, чтобы не возвращать отрицательные значения - PullRequest
3 голосов
/ 04 ноября 2008

У меня есть запрос, в котором я извлекаю среду выполнения исполняемого файла. База данных содержит время начала и время окончания. Я хотел бы получить общее время для пробежки. Пока что у меня есть:

SELECT startTime, endTime,
cast(datediff(hh,starttime,endtime) as varchar)
+':'
+cast(datediff(mi,starttime,endtime)-60*datediff(hh,starttime,endtime) as varchar) AS RUNTIME
FROM applog
WHERE runID = 33871
ORDER BY startTime DESC 

Когда я выполняю это, я получаю ожидаемые значения, а также некоторые неожиданные. Например, если время начала = 2008-11-02 15: 59: 59.790 и время окончания = 2008-11-02 19: 05: 41.857, тогда время выполнения = 4: -54. Как получить очередь в MS SQL SMS для возврата значения 3:06 для этого случая?

Спасибо.

Эоин Кэмпбелл, который я выбрал в качестве ответа, является наиболее пуленепробиваемым для моих нужд. Давида Б. тоже можно сделать.

Ответы [ 4 ]

3 голосов
/ 04 ноября 2008

Попробуйте это

Принимая 2 объявленные даты.

declare @start datetime
set @start = '2008-11-02 15:59:59.790'

declare @end datetime
set @end = '2008-11-02 19:05:41.857'

Это вернет часы / минуты / секунды

select 
    (datediff(ss, @start, @end) / 3600), 
    (datediff(ss, @start, @end) / 60) % 60,
    (datediff(ss, @start, @end) % 60) % 60

--returns

----------- ----------- -----------
3           5           42

Это версия составной строки с нулевым дополнением

select
RIGHT('0' + CONVERT(nvarchar, (datediff(ss, @start, @end) / 3600)), 2) + ':' +
RIGHT('0' + CONVERT(nvarchar, (datediff(ss, @start, @end) / 60) % 60), 2) + ':' +
RIGHT('0' + CONVERT(nvarchar, (datediff(ss, @start, @end) % 60) % 60), 2)

--------
03:05:42
1 голос
/ 04 ноября 2008

Вы должны соответствовать вашим звонкам в datediff (). Все они должны использовать один и тот же аргумент datepart.

См. Статья MSDN DATEDIFF (Transact-SQL) .

В вашем примере вы используете как "mi", так и "hh" и объединяете.

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

1 голос
/ 04 ноября 2008

Вот способ сделать это:

-- Find Hours, Minutes and Seconds in between two datetime
DECLARE @First datetime
DECLARE @Second datetime
SET @First = '04/02/2008 05:23:22'
SET @Second = getdate()

SELECT DATEDIFF(day,@First,@Second)*24 as TotalHours,
DATEDIFF(day,@First,@Second)*24*60 as TotalMinutes,
DATEDIFF(day,@First,@Second)*24*60*60 as TotalSeconds
0 голосов
/ 04 ноября 2008

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

DECLARE @applog TABLE
(
  runID int,
  starttime datetime,
  endtime datetime
)

INSERT INTO @applog (runID, starttime, endtime)
SELECT 33871, '2008-11-02 15:59:59.790', '2008-11-02 19:05:41.857'
-------------------
SELECT
  SUBSTRING(convert(varchar(30), DateAdd(mi, duration, 0), 121),
  12, 5) as prettyduration
FROM
(
SELECT starttime, DateDiff(mi, starttime, endtime) as duration
FROM @applog
WHERE runID = 33871
) as sub

Если вам нужно представлять более 24 часов, вы должны использовать другую логику представления. Это как раз то, о чем я мог подумать быстрее всего.

...