2015-02-10 76 views
0

通過下面的查詢,我得到表中每個 記錄的DATEDIFF。如何獲得datediff的平均時間?

我怎樣才能得到所有記錄的日期的AVG?

我不關心日期只有時間。

SELECT 
right('0' + convert(float,datediff 
        (second, callstartdt,endstartdt)/ 60 % 60), 2) + ':' + 
right('0' + convert(float,datediff 
        (second, callstartdt,endstartdt)% 60),2) as total_time 
FROM times 

http://sqlfiddle.com/#!6/f01c6/2

我有SQL 2012

+0

有什麼期望輸出 – 2015-02-10 17:18:09

+0

真的沒有點在分鐘計算的'%60'部分如果它永遠不會顯示超過幾分鐘和幾秒鐘。 – shawnt00 2015-02-10 18:12:29

回答

1

你可以只撲通的AVG()在那裏:

SELECT 
    right('0' + convert(float,AVG(datediff (second, callstartdt,endstartdt))/ 60 % 60), 2) + ':' 
    + right('0' + convert(float,AVG(datediff (second, callstartdt,endstartdt))% 60),2) as total_time 
FROM times 

演示:SQL Fiddle

+0

似乎OP不擔心任何事情會持續幾分鐘。一旦超過一個小時,分鐘部分將不正確(或誤導)。 – shawnt00 2015-02-10 17:55:20

+0

@ shawnt00確實如此,我的假設是樣本值具有代表性。 – 2015-02-10 17:59:27

+0

@ shawnt00如果運行時間更長,爲什麼它會不正確? – jfishbow 2015-02-10 18:18:58

0
with avg_s as (
    select avg(datediff(ss, callstartdt, endstartdt)) as ss from times 
) 
select 
    ss/86400 as days, 
    ss % 86400/3600 as hours, 
    ss % 3600/60 as minutes, 
    ss % 60 as seconds, 
    concat(
     format(ss/3600, '00:'), /* could be greater than 24 */ 
     format(ss % 3600/60, '00:'), 
     format(ss % 60, '00') 
    ) 
from avg_s 

老有日期時間破解會讓你做這樣的事情,但它的很多是SQL Server的更高版本過時。

select cast(avg(
     cast(cast(endstartdt as datetime) - 
     cast(callstartdt as datetime) 
    as float)) as datetime) 
from times