我正在尝试确定在SQL中截断或删除额外的小数位而不舍入的最佳方法。例如:
declare @value decimal(18,2)
set @value = 123.456
这将自动将@value舍入为123.46,这在大多数情况下都很好。然而,对于这个项目,我不需要那样。有没有一种简单的方法来截断我不需要的小数?我知道我可以使用left()函数并将其转换回小数。还有别的办法吗?
我正在尝试确定在SQL中截断或删除额外的小数位而不舍入的最佳方法。例如:
declare @value decimal(18,2)
set @value = 123.456
这将自动将@value舍入为123.46,这在大多数情况下都很好。然而,对于这个项目,我不需要那样。有没有一种简单的方法来截断我不需要的小数?我知道我可以使用left()函数并将其转换回小数。还有别的办法吗?
当前回答
对(x,1)取余是最简单的方法。
其他回答
我认为我们可以在Hackerrank中找到更简单的示例解决方案:
问题说明:查询北纬的最大值 (LAT_N)来自小于137.2345的STATION。截断你的答案 小数点后4位。
SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;
上面的解决方案告诉你如何简单地将值限制在4个小数点内。如果你想降低或提高小数后面的数字,只要把4改成你想要的任何数字。
以下是我能够截断而不是舍入的方法:
select 100.0019-(100.0019%.001)
返回100.0010
你的例子是:
select 123.456-(123.456%.001)
返回123.450
现在,如果你想去掉0结尾,只需对它进行强制转换:
select cast((123.456-(123.456%.001)) as decimal (18,2))
返回123.45
另一种方法是ODBC的TRUNCATE函数:
DECLARE @value DECIMAL(18,3) =123.456;
SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result
现场演示
输出:
╔═════════╦═════════╗
║ val ║ result ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝
备注:
我建议使用内置的ROUND函数,第3个参数设置为1。
对(x,1)取余是最简单的方法。
这将删除任何数字的小数部分
SELECT ROUND(@val,0,1)