4

我有一个名为 Amount 的数据库表字段,其类型为小数(18,6)。所以它存储在数据库中最多 6 个小数点,如 9.786534 但是在使用选择查询检索该字段时,我必须注意如下

  1. 删除试验零例如如果数字是 9.230000 那么结果只有 9.23
  2. 如果小数点全为零,则仅删除四个试验零,例如如果数字为 9.000000,则结果为 9.00

  3. 如果有试零,结果最多保留 2 个小数点。

如果我们编写简单的查询,例如

从 EmployeeMaster 中选择 TOP 1 金额

然后它给出 9.230000

但我的意图是删除尾随零..

请帮我..

4

8 回答 8

1

来自十进制(18,6)你可以做......

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

大多数支持 CAST 函数的数据库在转换时都会对数字进行四舍五入。在 SQLServer 上,如果我想要四舍五入,我会这样做。

如果你真正想要的是一个小数点后只有两位数字的字符串,那么你可以

select cast((Amount as decimal(18,2)) as nvarchar)

nvarchar 是 SQLServer 的可变长度 unicode 类型。数据库在字符串类型上并不一致。您的数据库可能有不同的数据库。该sql的其余部分是ANSI标准。并非所有 dbs 都支持,但很多都支持。

于 2012-04-27T05:53:09.013 回答
1

它适用于删除尾随零,但我仍然无法转换99.00这种方法。

Declare @myvalue varchar(50), 
        @Price Varchar(50) 

Set @Price = '9.230000' 

set @Myvalue = reverse(substring(@Price,patindex('%.%',@Price)+1,len(@Price))) 


SELECT 
case  
When  patindex('%.%[1-9]%',@price) = 0 Then  
    substring(@price,1,patindex('%.%',@price)-1) 
else 
    substring(@price,1,patindex('%.%',@price)-1) + '.' +  Reverse(substring(@Myvalue,patindex('%[1-9]%',@Myvalue),len(@Myvalue))) 
END 
于 2012-04-27T05:36:40.077 回答
1

这应该工作

SELECT CAST(REPLACE(RTRIM(REPLACE(CAST(CAST(33.9082976 AS DECIMAL(38,8)) AS NVARCHAR(256)),'0',' ')),' ','0') AS FLOAT)
于 2016-11-02T11:29:12.567 回答
0

这行得通吗?

select TOP 1 ROUND(Amount, 2) From EmployeeMaster 
于 2012-04-27T05:08:45.247 回答
0

另一种方法:

1)将小数转换为字符串;

2) 将字符串拆分为 2 部分,将最后 4 个字符与字符串的其余部分分开;

3) 删除最后 4 个字符的尾随零;

4)将两个部分连接回来。

WITH data (V)     AS (SELECT CAST(9.786534 AS decimal(18,6))
                      UNION ALL
                      SELECT CAST(9.78653  AS decimal(18,6))
                      UNION ALL
                      SELECT CAST(9.7800   AS decimal(18,6))
                      UNION ALL
                      SELECT CAST(9.7      AS decimal(18,6))
                      UNION ALL
                      SELECT CAST(9.00000  AS decimal(18,6))
                     )

,    AsString (V) AS (SELECT CAST(V AS varchar) FROM data)

,    Split (L, R) AS (SELECT LEFT(V, LEN(V) - 4), RIGHT(V, 4) FROM AsString)

,    Adjusted     AS (SELECT L,
                             REPLACE(RTRIM(REPLACE(R, '0', ' ')), ' ', '0') AS R
                      FROM Split)

SELECT Result = L + R FROM Adjusted

上述脚本的输出是:

Result
--------
9.786534
9.78653
9.78
9.70
9.00
于 2012-04-27T08:12:40.447 回答
0

我想在你的情况下使用 patindex :

CASE WHEN FLOOR(Amount) <> CEILING(Amount) THEN 
     LTRIM(SUBSTRING(STR(Amount, 18, 6), 1, LEN(STR(Amount, 18, 6)) - PATINDEX('%[^0]%', REVERSE(str(Amount, 18, 6))) + 1))
     ELSE STR(Amount,18,2)
END
于 2013-02-27T14:31:16.480 回答
0

试试下面提到的代码。

SELECT TOP 1 CONVERT(DECIMAL(10,2),Amount) From EmployeeMaster 

希望它能按预期工作。

于 2012-04-27T05:14:03.093 回答
0

对于一个decimal(18,6)领域,这应该工作:

select trim(to_char(Amount, '999999999999999999.99')) from EmployeeMaster 

(至少对于 Oracle,不确定其他类型)

于 2016-05-03T14:07:18.967 回答