Oracle TO_CHAR 格式模块 'FM099999999V99MI' 在 SQL 服务器中等效

Oracle TO_CHAR Format Module 'FM099999999V99MI' equivalent in SQL Server

我正在将数据从 Oracle 移动到 MS SQL 服务器。我正在为金额字段使用 TO_CHAR 格式模块,以使用 FM 将金额更改为所需的格式。我正在 SQL 服务器中寻找等效函数以获得相同的输出。

甲骨文:

Select Amount, TO_CHAR(Amount, 'FM099999999V99MI') as Converted from Billing_table

输出:

Amount Converted
0 00000000000
1985.56 00000198556
18.63 00000001863 ​
-258.93 00000025893- ​
-6.02 00000000602- ​

SQL 服务器确实有 format(),但请注意。由于性能问题,应谨慎使用

例子

Declare @YourTable table (Amount*100 decimal(15,2))
Insert Into @YourTable values
 (0)
,(1985.56)
,(18.63)
,(-258.93)
,(-6.02)


Select Amount 
      ,Converted =  format(Amount*100,'00000000000;00000000000-')
 From  @YourTable

结果

Amount  Converted
0.00    00000000000
1985.56 00000198556
18.63   00000001863
-258.93 00000025893-
-6.02   00000000602-

根据 this answer and custom format string 你可以使用:

with a as (
  select *
  from(values (0), (1985.56), (18.63), (-258.93), (-6.0234), (-10)) as t(val)
)
select
  val,
  /*Set explicit format with fixed decimal points*/
  replace(format(val, '000000000.00;000000000.00-'), '.', '') as formatted,
  /*Explicit multiplication*/
  format(val*100, '00000000000;00000000000-') as formatted2
from a
GO
      val | formatted    | formatted2  
--------: | :----------- | :-----------
   0.0000 | 00000000000  | 00000000000 
1985.5600 | 00000198556  | 00000198556 
  18.6300 | 00000001863  | 00000001863 
-258.9300 | 00000025893- | 00000025893-
  -6.0234 | 00000000602- | 00000000602-
 -10.0000 | 00000001000- | 00000001000-

db<>fiddle here

大概有 100 种不同的方法可以做到这一点。 FORMAT() 确实看起来更干净、更直观,但像约翰一样,我远离它 due to performance overhead

CREATE TABLE dbo.nums(val decimal(15,2));

INSERT dbo.nums(val) VALUES(0),
(1985.56),
(18.63),
(-258.93),
(-6.02);

SELECT val, RIGHT(REPLICATE('0',11) 
    + RTRIM(CONVERT(int,100*ABS(val))),11) 
    + CASE WHEN val < 0 THEN '-' ELSE '' END
  FROM dbo.nums;

结果:

val (No column name)
0.00 00000000000
1985.56 00000198556
18.63 00000001863
-258.93 00000025893-
-6.02 00000000602-