繁体   English   中英

如何获得DATEDIFF()的平均值?

[英]How to get the average of a DATEDIFF()?

我有以下查询:

SELECT 
    DATEDIFF(day, DateUsed, DateExpires) AS DaysBetweenExpirationAndUse
FROM tblOffer

我如何从DaysBetweenExpirationAndUse列中获取平均天数?

这应该工作正常:

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

这个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
SELECT AVG(DATEDIFF(d, DateUsed, DateExpires)) FROM tbl

应该工作正常。 请注意,由于DATEDIFF返回整数值,因此结果也将是整数。

如果要“精确”(就浮点而言)平均值,请使用

SELECT AVG(CAST(DATEDIFF(d, DateUsed, DateExpires) AS FLOAT)) FORM tbl

DATEDIFF函数与计算INT值的平均值(AVG)无关。 SQL Server的行为与其他服务器不同,但符合ANSI SQL标准

如果指定了AVG并且DT是精确数字(请注意:INT是一个精确数字),则结果的数据类型是精确数字,实现定义的精度不小于DT的精度,实现定义的小数位数不小于DT的规模。

(在我看来)在这种情况下没有帮助。 大多数人会期望AVG(INT value)会导致NUMERIC/DECIMAL/FLOAT/REAL结果,但结果将是截断的INT值。 解决方案是使用CONVERT(DECIMAL(p,s)/NUMERIC(p,s), ...)或简单地乘以1.1.0将[TINY | SMALL | BIT] INT值转换为DECIMAL/NUMERIC

例:

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
*/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM