Sql server 显示小数位数超过5位的项目的方法?

Sql server 显示小数位数超过5位的项目的方法?,sql-server,Sql Server,我试图过滤掉一些查询结果,使其只显示小数点后6位的项目。我不需要对答案进行四舍五入或加0,只需过滤掉小数点后5位或以下的内容。我当前的查询如下:(例如,如果项目是199.54215,我不想看到它,但如果是145.253146,我需要返回它) 任何帮助都将不胜感激 下面是一个使用到varchar的转换和使用小数点的LEN-CHARINDEX的示例,我并不是说这是最好的方法,但您确实要求提供语法示例,因此,请看: --Temp Decimal value holding up to 10 deci

我试图过滤掉一些查询结果,使其只显示小数点后6位的项目。我不需要对答案进行四舍五入或加0,只需过滤掉小数点后5位或以下的内容。我当前的查询如下:(例如,如果项目是199.54215,我不想看到它,但如果是145.253146,我需要返回它)


任何帮助都将不胜感激

下面是一个使用到
varchar
的转换和使用小数点的
LEN
-CHARINDEX的示例,我并不是说这是最好的方法,但您确实要求提供语法示例,因此,请看:

 --Temp Decimal value holding up to 10 decimal places and 10 whole number places
DECLARE @temp DECIMAL(20, 10) = 123.4565432135


    --LEN returns an integer number of characters in the converted varchar
    --CHARINDEX returns the integer location of the decimal where it is found in the varchar
    --IF the number of characters left after subtracting the index of the decimal from the length of the varchar is greater than 5, 
    --you have more than 6 decimal places
IF LEN(CAST(@temp AS varchar(20))) - CHARINDEX('.', CAST(@temp AS varchar(20)), 0) > 5
    SELECT 1
ELSE
    SELECT 0

如果您的数据库值是
VARCHAR
,并且存在于数据库中,如下所示:

100.123456
100.1
100.100
您可以使用通配符
来实现这一点,比如
语句示例

WHERE YOUR_COLUMN_NAME LIKE '%.[0-9][0-9][0-9][0-9][0-9][0-9]%'

这将是任何包含一个小数位,后跟至少6个数值的内容。这里是一种简写方法

WHERE (LEN(CONVERT(DOUBLE PRECISION, FieldName % 1)) - 2) >=5

一种方法是将该列转换为较低的精度。这样做会导致自动四舍五入,但这将显示它是否是基于最后一位数字的6位小数。如果转换值的最后一位为0,则为false,否则为true

declare @table table (v decimal(11,10))
insert into @table
values
(1.123456789),
(1.123456),
(1.123),
(1.123405678)

select
    v
    ,cast(v as decimal(11,5))          --here, we are changing the value to have a precision of 5. Notice the rounding.
    ,right(cast(v as decimal(11,5)),1) --this is taking the last digit. If it's 0, we don't want it
from @table
因此,您的
where
子句将是简单的


where right(cast(tra_cantidadparcial as decimal(11,5)),1)>0

这里是一个使用ROUND的示例,它似乎是理想的函数,因为它仍然存在于数字领域中。如果最多有5位小数,则四舍五入到5位小数将保持该值不变

create table #test (Tra_cantidadparcial decimal(20,10));

INSERT #test (Tra_cantidadparcial) VALUES (1),(99999.999999), (1.000001), (45.000001), (45.00001);

SELECT * FROM #test WHERE ROUND(Tra_cantidadparcial,5) != Tra_cantidadparcial;

drop table #test

您可以转换为varchar,然后从“.”开始执行子字符串,如果LEN大于5,则它是一个至少有6位小数的数字。或者你也可以拿这个时期的透镜,这可能会更容易,这就是
where FLOOR(Tra_cantidadparcial*100000)=tra_cantidadparcial*100000
已经完成,因为它只考虑非零数字,而不是存储中使用的小数位数。如果它不起作用,请仔细查看您的源数据(对于
FLOAT
数据,首先它不一定能正常工作)。这应该适用于十进制类型的值:
where(tra_cantidadparcial*1000000)mod 10 0
我删除了我以前的注释,它也适用于较小的值。很好的解决方案。OP同时声明了X=>6和X=6。这适用于X>=6,但不适用于X=6。
create table #test (Tra_cantidadparcial decimal(20,10));

INSERT #test (Tra_cantidadparcial) VALUES (1),(99999.999999), (1.000001), (45.000001), (45.00001);

SELECT * FROM #test WHERE ROUND(Tra_cantidadparcial,5) != Tra_cantidadparcial;

drop table #test