aba*_*hev 77 sql t-sql formatting decimal sql-server-2008
我有一个列,DECIMAL(9,6)
即它支持像999,123456这样的值.
但是当我插入像123,4567这样的数据时,它变成了123,456700
如何删除那些零?
And*_*mar 136
A decimal(9,6)
在逗号右侧存储6位数字.是否显示尾随零是格式化决策,通常在客户端实现.
但是由于SSMS格式float
没有尾随零,您可以通过将其decimal
转换为 float
以下内容来删除尾随零:
select
cast(123.4567 as DECIMAL(9,6))
, cast(cast(123.4567 as DECIMAL(9,6)) as float)
Run Code Online (Sandbox Code Playgroud)
打印:
123.456700 123,4567
Run Code Online (Sandbox Code Playgroud)
(我的小数点分隔符是一个逗号,但SSMS使用点格式化十进制.显然是一个已知问题.)
rob*_*rt4 29
您可以使用该FORMAT()
功能(SqlAzure和Sql Server 2012+):
SELECT FORMAT(CAST(15.12 AS DECIMAL(9,6)), 'g18') -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10') -- '0.000158'
SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- '2'
Run Code Online (Sandbox Code Playgroud)
使用FLOAT(或REAL)时要小心:不要使用g17
或更大(或者g8
使用REAL更大),因为机器表示的有限精度会导致不必要的影响:
SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17') -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8') -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7') -- '0.9'
Run Code Online (Sandbox Code Playgroud)
此外,请注意,根据文件:
FORMAT依赖于.NET Framework公共语言运行时(CLR)的存在.此功能不会被远程控制,因为它取决于CLR的存在.远程处理需要CLR的函数会导致远程服务器出错.
也适用于SqlAzure.
Bat*_*mer 17
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
Run Code Online (Sandbox Code Playgroud)
Cai*_*ard 10
我不愿意转为浮动,因为我的十进制数字可能比浮点数更多
FORMAT
当与标准.net格式字符串'g8'一起使用时,如果小数字非常小(例如1e-08),则返回科学记数法,这也是不合适的
使用自定义格式字符串(https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings)让我实现了我想要的目标:
DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23
Run Code Online (Sandbox Code Playgroud)
如果您希望您的号码至少有一个尾随零,那么2.0不会变为2,请使用格式字符串 0.0#####
小数点是本地化的,因此使用逗号作为小数分隔符的文化将遇到逗号输出.是
当然,这是让数据层进行格式化的不可行的做法(但在我的情况下,没有其他层;用户实际上是在运行存储过程并将结果放入电子邮件中:/)
小智 6
SELECT REVERSE(ROUND(REVERSE(2.5500),1))
Run Code Online (Sandbox Code Playgroud)
打印:
2.55
Run Code Online (Sandbox Code Playgroud)
小智 6
尝试这个 :
SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")
Run Code Online (Sandbox Code Playgroud)
给出 20.55