我正在尝试确定在SQL中截断或删除额外的小数位而不舍入的最佳方法。例如:

declare @value decimal(18,2)

set @value = 123.456

这将自动将@value舍入为123.46,这在大多数情况下都很好。然而,对于这个项目,我不需要那样。有没有一种简单的方法来截断我不需要的小数?我知道我可以使用left()函数并将其转换回小数。还有别的办法吗?


当前回答

以下是我能够截断而不是舍入的方法:

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

其他回答

我认为我们可以在Hackerrank中找到更简单的示例解决方案:

问题说明:查询北纬的最大值 (LAT_N)来自小于137.2345的STATION。截断你的答案 小数点后4位。

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

上面的解决方案告诉你如何简单地将值限制在4个小数点内。如果你想降低或提高小数后面的数字,只要把4改成你想要的任何数字。

ROUND ( 123.456 , 2 , 1 )

当第三个参数!= 0时,它截断而不是舍入。

语法

ROUND ( numeric_expression , length [ ,function ] )

参数

numeric_expression Is an expression of the exact numeric or approximate numeric data type category, except for the bit data type. length Is the precision to which numeric_expression is to be rounded. length must be an expression of type tinyint, smallint, or int. When length is a positive number, numeric_expression is rounded to the number of decimal positions specified by length. When length is a negative number, numeric_expression is rounded on the left side of the decimal point, as specified by length. function Is the type of operation to perform. function must be tinyint, smallint, or int. When function is omitted or has a value of 0 (default), numeric_expression is rounded. When a value other than 0 is specified, numeric_expression is truncated.

如果你想要取一些像89.0904987这样的数字,并通过省略不需要的小数位将其转换为89.09,只需使用以下方法:

select cast(yourColumnName as decimal(18,2))

下面的截图来自W3Schools SQL数据类型部分,它描述了decimal(18,2)的作用:

因此,

select cast(89.0904987 as decimal(18,2))

给你:89.09

这将删除任何数字的小数部分

SELECT ROUND(@val,0,1)

另一种方法是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。