在Access中的日期时间平均值

时间:2008-11-20 15:57:53

标签: sql sql-server tsql ms-access

我将一些查询从Access移植到T-SQL,编写查询的人在datetime列上使用了Avg聚合函数。这在T-SQL中是不受支持的,我可以理解为什么 - 它没有意义。什么是平均值?

所以当我使用Avg汇总日期时间时,我正要开始进行逆向工程,但是我想先把问题抛出来。

3 个答案:

答案 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 (同义词DOUBLEFLOAT8IEEEDOUBLENUMBER)有限制,例如最大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