我将一些查询从Access移植到T-SQL,编写查询的人在datetime列上使用了Avg聚合函数。这在T-SQL中是不受支持的,我可以理解为什么 - 它没有意义。什么是平均值?
所以当我使用Avg汇总日期时间时,我正要开始进行逆向工程,但是我想先把问题抛出来。
答案 0 :(得分:3)
我认为Access正在平均日期的数字表示。您可以在T-SQL中执行以下操作...
select AverageDate = cast(avg(cast(MyDateColumn as decimal(20, 10))) as datetime)
from MyTable
答案 1 :(得分: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年开始与实际日期时间值之间的平均间隔,然后将该间隔添加到2000年的开始。“2000年开始”的选择是任意的;只要在AVG()函数中减去的日期时间被添加回来,就会得到明智的答案。
这假设使用的DBMS支持SQL标准'timestamp'表示法,并且适当地支持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
答案 2 :(得分:1)
@David W. Fenton:“Jet日期字段是当天的整数值加上时间的小数值” - 不,ACE / Jet DATETIME
列是FLOAT
(同义词DOUBLE
,FLOAT8
,IEEEDOUBLE
,NUMBER
)有限制,例如最大DATETIME
值是#9999-12-31:23:59:59#虽然可以投放到FLOAT
的最大DATETIME
值会稍大一些,例如
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