2008-11-20 128 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