我尝试阅读之前提出的问题,尝试不同的解决方案,但我似乎无法弄明白。我还在学习,所以非常感谢任何提示和指导。
这是我的查询
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',但我无法弄清楚正确的语法。
由于
答案 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