我有以下查询:
SELECT
DATEDIFF(day, DateUsed, DateExpires) AS DaysBetweenExpirationAndUse
FROM tblOffer
我怎样才能获得DaysBetweenExpirationAndUse
列的平均天数?
答案 0 :(得分:8)
这应该可以正常工作:
SELECT AVG(DATEDIFF(d, DateUsed, DateExpires)) AS AvgDaysBetweenExpirationAndUse
FROM tbl
如果你想在AVG中使用小数位:
SELECT AVG(DATEDIFF(d, DateUsed, DateExpires)*1.0) AS AvgDaysBetweenExpirationAndUse
FROM tbl
如果您想选择AVG
和其他字段,请不要分组:
SELECT *
,AVG(DATEDIFF(d, DateUsed, DateExpires)*1.0) OVER() AS AvgDaysBetweenExpirationAndUse
FROM tbl
答案 1 :(得分:4)
这个sql可以执行吗?
SELECT AVG(t.a) from
(
SELECT DATEDIFF(d, DateUsed, DateExpires) AS a
FROM tbl
) as t
这是我的测试:
但很好的答案是:
SELECT AVG(DATEDIFF(d, DateOne, DateTwo)*1.0) AS avgDate
FROM Test
答案 2 :(得分:1)
SELECT AVG(DATEDIFF(d, DateUsed, DateExpires)) FROM tbl
应该可以正常工作。注意,由于DATEDIFF
返回一个整数值,结果也将是一个整数。
如果你想要“精确”(浮点数得到)平均值,请使用
SELECT AVG(CAST(DATEDIFF(d, DateUsed, DateExpires) AS FLOAT)) FORM tbl
答案 3 :(得分:1)
DATEDIFF
函数与计算INT值的平均值(AVG)无关。 SQL Server的行为与其他服务器不同,但符合ANSI SQL标准
如果指定了AVG并且DT是精确数字(个人注释:INT是精确数字),那么数据 结果的类型是精确的数字与实现 - 定义的精度不低于DT的精度 实现定义的规模不小于DT的规模。
(在我看来)在这种情况下没有帮助。大多数人都希望AVG(INT value)
会导致NUMERIC/DECIMAL/FLOAT/REAL
结果,但结果将是截断的INT值。解决方案是使用DECIMAL/NUMERIC
将[TINY | SMALL | BIT] INT值转换为CONVERT(DECIMAL(p,s)/NUMERIC(p,s), ...)
,或者只需与1.
或1.0
相乘。
示例:
SELECT ColINT, SQL_VARIANT_PROPERTY(ColINT,'BaseType') AS Col_DataType
FROM
(
SELECT 10 AS ColINT UNION ALL SELECT 9
) x;
/*
ColINT Col_DataType
----------- ------------
10 int
9 int
*/
SELECT AVG(ColINT) AS Avg#1, SQL_VARIANT_PROPERTY(AVG(ColINT),'BaseType') AS Avg#1_DataType
FROM
(
SELECT 10 AS ColINT UNION ALL SELECT 9
) x;
/*
Avg#1 Avg#1_DataType
----------- --------------
9 int
*/
SELECT AVG(ColINT) AS Avg#2, SQL_VARIANT_PROPERTY(AVG(ColINT),'BaseType') AS Avg#2_DataType
FROM
(
SELECT 10 AS ColINT UNION ALL SELECT 9
) x;
/*
Avg#2 Avg#2_DataType
----------- --------------
9 int
*/