2012-03-04 64 views

回答

1

免責聲明:可能有很多更好的方式來做到這一點。

注:

  • 不能使用AVG()功能對一個DATETIME/TIME
  • 我鑄造DATETIMEDECIMAL(18, 6)這似乎得到一個合理的(+ - 幾毫秒)精確的結果。

#1 - Average日期

SELECT 
    CAST(AVG(CAST(TimeOfInterest AS DECIMAL(18, 6))) AS DATETIME) 

FROM dbo.MyTable; 

#2 - 的平均時間 - 刪除日期部分,鑄造,然後平均

SELECT 
    CAST(AVG(CAST(TimeOfInterest - CAST(TimeOfInterest AS DATE) AS DECIMAL(18, 6))) AS DATETIME) 

FROM dbo.MyTable; 

第二個例子中減去日期部分DATETIME從它本身,只留下時間部分,然後將其轉換爲十進制進行平均,並返回到012用於格式化的。您需要刪除日期部分(這是毫無意義的),時間部分應該表示集合中的平均時間。

+0

我需要額外的轉換的情況下,'TimeOfInterest'是類型的'datetime2',它不具有相同的轉化爲'datetime'(GRR) 。將編輯。 – 2015-08-17 13:43:57

0
SELECT CAST(AVG(CAST(ReadingDate AS real) - FLOOR(CAST(ReadingDate as real))) AS datetime) 
FROM Rbh 
0

我知道,在至少一些的SQL標準,值表達式(參數到AVG()函數)不允許是日期時間值或字符串值。我沒有閱讀過所有的SQL標準,但是如果多年來這個限制已經放鬆,我會感到驚訝。

部分原因是,這是因爲'n'值的「平均值」(或算術平均值)被定義爲值除以'n'的總和。而'01-Jan-2012 08:00'+ '03 -Mar-2012 07:53'的表達沒有任何意義。 '01 -Jan-2012 08:00'/ 3

微軟公司的產品通過暴露他們的日期和時間數據類型的內部表示方式,使得SQL有了快速和鬆散的歷史。丹尼斯·裏奇會稱這是「實施過程中毫無道理的狡猾。」

在早期版本的Microsoft Access中(也可能在當前版本中),可以將日期'01-Jan-2012'乘以日期'03 -Mar-2012'並獲得實際返回值,據推測以方形日期爲單位。

如果你的dbms支持「間隔」數據類型,那麼取平均值就很簡單,並且你所期望的是。 (SQL Server不支持間隔數據類型。)

create table test (
    n interval hour to minute 
); 

insert into test values 
('1:00'), 
('1:30'), 
('2:00'); 

select avg(n) 
from test; 

avg (interval) 
-- 
01:30:00