2008-11-20 147 views
2

我將Access中的一些查詢移植到T-SQL,編寫查詢的人在datetime列上使用了Avg聚合函數。這在T-SQL中不被支持,我可以理解爲什麼 - 它沒有意義。平均得分是多少?Access中的日期時間平均值

所以我打算開始反向工程,當它使用Avg聚合日期時間時,Access做了什麼,但是我以爲我會先把問題放在這裏。

回答

3

我想像的是平均日期的數字表示。你可以這樣做在T-SQL具有以下相似...

select AverageDate = cast(avg(cast(MyDateColumn as decimal(20, 10))) as datetime) 
from MyTable 
+0

是的,這就是我所設想的,這可能是最合乎邏輯的事情。我想知道是不是像一天的平均時間或某種事情那樣進行某種分區。 – 2008-11-20 16:45:52

1

我更熟悉的非MS DBMS,但是......既然你不能添加兩個DATETIME值,你通常無法取它們的平均值。但是,你可以做類似的東西:

SELECT AVG(datetime_column - TIMESTAMP '2000-01-01 00:00:00.000000') + 
       TIMESTAMP '2000-01-01 00:00:00.000000' 
    FROM table_containing_datetime_column; 

此計算2000年開始與實際datetime值之間的平均間隔,然後補充說,間隔的2000年開始的「2000年開始的選擇'是任意的;只要將AVG()函數中減去的日期時間加回來,就會得到一個合理的答案。

這確實假定使用的DBMS支持SQL標準'時間戳'表示法,並且適當地支持INTERVAL類型。兩個DATETIME或TIMESTAMP值之間的差異應該是INTERVAL(事實上,INTERVAL DAY(9)TO SECOND(6))是中等準確的,但'9'有些爭議。

當適當錯位了我一起工作的DBMS,表達 '作品':

CREATE TEMP TABLE table_containing_datetime_column 
(
    datetime_column DATETIME YEAR TO FRACTION(5) NOT NULL 
); 

INSERT INTO table_containing_datetime_column VALUES('2008-11-19 12:12:12.00000'); 
INSERT INTO table_containing_datetime_column VALUES('2008-11-19 22:22:22.00000'); 

SELECT AVG(datetime_column - DATETIME(2000-01-01 00:00:00.00000) YEAR TO FRACTION(5)) + 
    DATETIME(2000-01-01 00:00:00.00000) YEAR TO FRACTION(5) 
FROM table_containing_datetime_column; 

答:

2008-11-19 17:17:17.00000 
1

@大衛W.芬頓:「噴氣日期字段是一個整數當天的值加上時間的十進制值「 - 否,ACE/Jet DATETIME列是FLOAT(同義詞DOUBLE,FLOAT8,IEEEDOUBLENUMBER),其限制例如最大DATETIME值是#9999-12-31:23:59:59#儘管可以投射到DATETIME的最大FLOAT值會稍大一些,例如

SELECT CDBL(CDATE('9999-12-31 23:59:59')) 

回報2958465.99998843,但是

SELECT CDATE(CDBL(2958465.9999999997)) 

沒有錯誤,而

SELECT CDATE(CDBL(2958465.9999999998)) 

確實錯誤。

因此,爲了保留SQL Server中的功能,我建議將DATETIME列轉換爲FLOAT例如

SELECT CAST(AVG(CAST(MyDateTimeColumn AS FLOAT)) AS DATETIME) 
    from MyTable