Sql server 显示小数位数超过5位的项目的方法?
我试图过滤掉一些查询结果,使其只显示小数点后6位的项目。我不需要对答案进行四舍五入或加0,只需过滤掉小数点后5位或以下的内容。我当前的查询如下:(例如,如果项目是199.54215,我不想看到它,但如果是145.253146,我需要返回它)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
任何帮助都将不胜感激 下面是一个使用到
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