日期:2014-05-18  浏览次数:20516 次

请教一个ROUNDUP的问题
请各位帮帮忙

在SQL里面怎么不能用ROUNDUP和ROUNDDOWN

------解决方案--------------------
可以用ROUND函数
-------------------------

ROUND
返回数字表达式并四舍五入为指定的长度或精度。

语法
ROUND ( numeric_expression , length [ , function ] )


注释
ROUND 始终返回一个值。如果 length 是负数且大于小数点前的数字个数,ROUND 将返回 0。

示例 结果
ROUND(748.58, -4)-- 0


当 length 是负数时,无论什么数据类型,ROUND 都将返回一个四舍五入的 numeric_expression。

示例 结果
ROUND(748.58, -1) --750.00
ROUND(748.58, -2) --700.00
ROUND(748.58, -3) --1000.00


示例
A. 使用 ROUND 和估计值
下例显示两个表达式,说明使用 ROUND 函数且最后一个数字始终是估计值。

SELECT ROUND(123.9994, 3), ROUND(123.9995, 3)
GO

下面是结果集:

----------- -----------
123.9990 124.0000

B. 使用 ROUND 和四舍五入的近似值
下例显示四舍五入和近似值。

语句 结果
SELECT ROUND(123.4545, 2)
123.4500

SELECT ROUND(123.45, -2)
100.00



C. 使用 ROUND 截断
下例使用两个 SELECT 语句说明四舍五入和截断之间的区别。第一个语句四舍五入结果。第二个语句截断结果。

语句 结果
SELECT ROUND(150.75, 0)
151.00

SELECT ROUND(150.75, 0, 1)
150.00




------解决方案--------------------
以roundup为例:
比如用vb写的dll,其工程名是ClassFun,类名为Fun:

Dim excelT As New Excel.Application
Public Function RoundUp(para As String, pos As String) As Double
Dim returnT As Double

excelT.Workbooks.Add
excelT.Visible = False
excelT.ActiveCell.FormulaR1C1 = "=roundup( " & para & ", " & pos & ") "
returnT = excelT.ActiveCell.Value

Stdev = returnT
Set excelT = Nothing
End Function

这个dll在sql中就可以用存储过程来调用
如:
declare @o int
declare @s int
declare @out real
declare @para varchar(100),@pos varchar(2)
exec @s=sp_oacreate 'ClassFun.Fun ',@o output
if @s <> 0
print 'error create object '

set @para= '23.34234 '--被格式参数
set @pos= '3 '--格式为3位
exec @s=sp_oamethod @o, 'RoundUp ',@out output, @para,@pos

select @out

------------------------
23.343

(所影响的行数为 1 行)