SQL - 平均范围的精确十进制值

时间:2018-03-26 15:01:10

标签: sql sql-server

我尝试阅读之前提出的问题,尝试不同的解决方案,但我似乎无法弄明白。我还在学习,所以非常感谢任何提示和指导。

这是我的查询

select  AVG(DATEDIFF(DAY, xx, yy)) AS DayDiff

FROM database1.dbo.table1

where month(datecompleted) = month(dateadd(month,-1,current_timestamp))
       and year(datecompleted) = year(dateadd(month,-1,current_timestamp))
       and ApprovalRequiredFrom = 'GRM'

结果sql给我9,但是当我在excel中平均时它是9.18。我需要sql给我2位小数。我尝试使用'cast',但我无法弄清楚正确的语法。

由于

2 个答案:

答案 0 :(得分:4)

SQL Server执行十进制除法,即使对于平均值也是如此。我只是乘以1.0作为快速修复:

select  AVG(1.0 * DATEDIFF(DAY, xx, yy)) AS DayDiff

答案 1 :(得分:2)

DATEDIFF函数返回整数(INT)值。 Average(AVG)返回与内部表达式相同的数据类型。整数值之间的操作(在SQL Server中)返回整数值。但是,整数和其他数值(如float或decimal)之间的操作将返回最后一个。

因此,如果将DATEDIFF转换为返回小数,则结果将为十进制。

SELECT AVG(CONVERT(DECIMAL(8,2), DATEDIFF(DAY, xx, yy))) AS DayDiff

遵循相同的规则,硬编码值1.0表示小数,因此将任何整数值乘以1.0会产生相同的值,但会生成十进制数据类型。

SELECT  AVG(DATEDIFF(DAY, xx, yy) * 1.0) AS DayDiff

正如Jeroen所提到的,转换参数将产生小数平均值,但小数超过2。你必须在最后转换平均结果。

SELECT  
    CONVERT(DECIMAL(8,2), 
        AVG(DATEDIFF(DAY, xx, yy) * 1.0)) AS DayDiff