2011-10-24 60 views
0

我的两个表(“Faults”)列表示错误事件的开始(“01:10:2011 12:45:59”)和结束(作为开始的格式)。我的查询需要每个事件的平均持续时间(结束开始)。sql - group by timestamp/month

我想查找按月记录的事件的平均持续时间,记住时间戳是以上述形式出现的。所以,如果我的表的事件是:

A|SERVICE|  END  |  START 
1|ADSL |1/11/2011 10:00:00 |4/11/2011 10:00:00 
2|ADSL |6/11/2011 12:00:00 |6/11/2011 24:00:00 
3|ADSL |5/12/2011 10:00:00 |6/12/2011 10:00:00 
4|ADSL |7/12/2011 12:00:00 |8/12/2011 24:00:00 

的分类结果(以天为单位)将成为第11个月线1,2 ([3days+0.5day]/2= 1.75d)的平均持续时间,为12个月的3,4的平均持续时间为1.25天

NOVEMBER|1.75 
DECEMBER|1.25 
+0

你使用哪个SQL-DB? –

+0

等等,你是说你的'时间戳'不是实际的'时间戳'类型,而是一个格式化的字符串?如果是这样,投资时间将需要您将数据库转换为使用实际类型 - 即时转换可能会花费相当长的时间(除了您没有受到无效数据保护的事实... )。不同的DB以不同的方式处理时间戳 - 例如,DB2只能给你一个近似值(除非你做了一些可笑的重数学)。 –

回答

1

使用DATEPART获得一个月值组:

SELECT DATENAME(month, MIN(Start)) AS [Month], DATEPART(YEAR, Start) As [Year], CONVERT(FLOAT, AVG(DATEDIFF(hour, Start,[End])))/24 AS [Days] 
    FROM Faults 
    GROUP BY DATEPART(Month, Start), DATEPART(Year, Start) 

包括GROUP BY年是至关重要的,如果你的数据跨越多个ÿ耳朵:-)

当然,如果故障跨越一个月的变化,你需要决定做什么(为归属于结束或开始月份全错,还是应该被拆分?)