2015-02-10 90 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