2008-11-03 68 views
3

我有一個查詢,我正在拉一個可執行文件的運行時。數據庫包含其開始時間和結束時間。我想獲得跑步的總時間。 到目前爲止,我有:SQL:獲取DATEDIFF不返回負值

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 

當我執行此我得到的預期值,也有一些意外。 例如,如果starttime = 2008-11-02 15:59:59.790和endtime = 2008-11-02 19:05:41.857則運行時間= 4:-54。 如何獲取MS SQL SMS中的一個隊列以便爲這種情況返回值3:06?

謝謝。

我選擇Eoin Campbell's作爲答案是最符合我需求的。大衛B是可行的。

回答

3

試試這些

假設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 
+0

超級!正是我需要的!謝謝! – 2009-03-19 13:48:11

1

Here's的方式做到這一點:

-- 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

如果你用日曆日期來思考,這很好,但所有答案都是「日大小」的。 3:06顯然不是一天大小的塊。 – 2008-11-03 22:40:09

0

你應該分開你的計算和表示邏輯:

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小時,你會使用不同的表示方法邏輯。這正是我能想到的最快的。

1

你需要使用到DATEDIFF您的來電(一致)。他們都應該使用相同的datepart參數。

請參閱MSDN's DATEDIFF (Transact-SQL) article

在你的例子中,你同時使用「mi」和「hh」並連接。

爲你的持續時間(可能是ss或s)選擇一個最小公分母數。根據此數學計算任何數學(因爲其他答案都是說明性的,但並不真正描述)。