我将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