我將Access中的一些查詢移植到T-SQL,編寫查詢的人在datetime列上使用了Avg聚合函數。這在T-SQL中不被支持,我可以理解爲什麼 - 它沒有意義。平均得分是多少?Access中的日期時間平均值
所以我打算開始反向工程,當它使用Avg聚合日期時間時,Access做了什麼,但是我以爲我會先把問題放在這裏。
我將Access中的一些查詢移植到T-SQL,編寫查詢的人在datetime列上使用了Avg聚合函數。這在T-SQL中不被支持,我可以理解爲什麼 - 它沒有意義。平均得分是多少?Access中的日期時間平均值
所以我打算開始反向工程,當它使用Avg聚合日期時間時,Access做了什麼,但是我以爲我會先把問題放在這裏。
我想像的是平均日期的數字表示。你可以這樣做在T-SQL具有以下相似...
select AverageDate = cast(avg(cast(MyDateColumn as decimal(20, 10))) as datetime)
from MyTable
我更熟悉的非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
@大衛W.芬頓:「噴氣日期字段是一個整數當天的值加上時間的十進制值「 - 否,ACE/Jet DATETIME
列是FLOAT
(同義詞DOUBLE
,FLOAT8
,IEEEDOUBLE
,NUMBER
),其限制例如最大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
是的,這就是我所設想的,這可能是最合乎邏輯的事情。我想知道是不是像一天的平均時間或某種事情那樣進行某種分區。 – 2008-11-20 16:45:52