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-
我正在将数据从 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- |