create account

每天进步一点点:MS-SQL保留指定位数小数 by oflyhigh

View this thread on: hive.blogpeakd.comecency.com
· @oflyhigh ·
$70.91
每天进步一点点:MS-SQL保留指定位数小数
春节期间是娱乐的时间,不过如果整天娱乐不学习浑身都难受,所以偶尔还是要调剂一下,娱乐之余就要学习。

每天进步一点点
![image.png](https://images.hive.blog/DQmPQVkwTyjuqZgb9w6QZ7MiGRFwLS73NiNcZZiujsfsSDj/image.png)
(图源 :[pixabay](https://pixabay.com/photos/lightbulb-idea-creativity-base-3104355/))


话说,前段时间在研究[使用HiveSQL查询历史挂单以及成交](https://hive.blog/hive-105017/@oflyhigh/6ycw3x-hivesql),发现计算出来的价格小数点后有很多位数字,这让生成的表格看起来不是那么规整。

那么有没有什么办法,让数字看起来更规整一些呢?其实从应用的角度看,我们大可以不用关心这点,因为SQL返回的数据一般都要再次进行处理的。

比如说,在Python中,我们就可以通过`round()`或者格式化输出,来实现我们想要的功能,相应代码如下:

使用`round()`:
```
a = 1.1118
b = round(a, 3)
print(b)
```

使用格式化输出:
```
a = 1.1118
print(f'{a:.3f}')
```
其它语言中也都有类似的机制,就不再赘述了。

现在的问题是,如何使用SQL(SQL Server)来达成我们的目标,而不是使用第三方语言再对数据进行额外处理。

首先,尝试使用round函数,为了便于说明问题,我们直接取一个包含N多位小数的数字,而不是直接从数据库中查询中计算出来的小数。

执行如下查询:
>`select round(0.3694826767916468913, 3);  `

结果如下:
>![image.png](https://images.hive.blog/DQmdn4toyfd1ZSAFQLXrXJZJr7pewXztZsq7hAmG8wxpLTe/image.png)

咦,这个结果是什么鬼?把`0.3694826767916468913`变成了`0.3690000000000000000`,看起来更不舒服了。

看了一下微软官网上关于round函数的介绍,其中返回值部分是这样说的:
>![image.png](https://images.hive.blog/DQmdLx3SKdgzS3Z9enDyq6VPXH7KSM23cKS4PYFxrGJzABT/image.png)

也就是说,根据输入的数据来判断输出的类型,所以对于一个小数点后有N位小数的数字而言,它返回的数字也是包含N位小数,也就是说在[SQL Server] SQL中,`round`只负责四舍五入,不负责截短,这和我想要的不一致呀?

如果我们使用的MySQL,那么应该可以用类似如下语句来负责截短:
>`SELECT TRUNCATE(135.376, 2);`

然而无论是文档以及实测,都表明MS SQL是不支持`TRUNCATE`函数的,所以得另想办法。

这时候就得请出`CAST`函数了,其语法如下:
>`CAST ( expression AS data_type [ ( length ) ] )`

也就是说,可以表达式转换成我们需要的数据类型,回到我们的例子中,我们就可以使用如下语句来处理我们的数据:
>`SELECT CAST (0.3694826767916468913 AS decimal (18,3));`

关于decimal数据类型,表示为`decimal[ (p[ ,s] )] `,其实就是我们常用的十进制数,详情可以参考这里:[decimal and numeric (Transact-SQL)](https://learn.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-ver16)。

其中`p` (精度),代表要存储的十进制数字的最大总数,默认为18;`s `(比例),代表存储在小数点右侧的小数位数。

上述查询返回如下结果:
>![image.png](https://images.hive.blog/DQmbrxv37EVYDLsjNRdwTy9ciYrRujUMxf4gNPXpCfzwVbU/image.png)

这是我们想要的结果,所以[之前文章中](https://hive.blog/hive-105017/@oflyhigh/6ycw3x-hivesql)的那个SQL就可以修改为:
```
select top 200 current_pays, current_pays_symbol, open_owner, open_pays, open_pays_symbol, 
	CAST(current_pays/open_pays AS decimal (18,3))as price, timestamp
	from VOFillOrders 
	where current_owner='oflyhigh' 
	order by timestamp desc
```

也就是说,将之前SQL中的:
>`amount_to_sell/min_to_receive as price`
修改为:
>`CAST(current_pays/open_pays AS decimal (18,3))as price`

对比下输出,修改之前:
>![image.png](https://images.hive.blog/DQmcEAuJoMVu43eJvk2CPY1icnerZDtGkS8w3JeAi3Rh1js/image.png)

修改之后:
>![image.png](https://images.hive.blog/DQmb9Ps3xL7TDvA3d8n2D6XAEcmrmFBfnrPxcjnwynjMUFx/image.png)

很明显,后者舒服多啦,更方便我们阅读和分析。

# 相关链接

* [使用HiveSQL查询历史挂单以及成交](https://hive.blog/hive-105017/@oflyhigh/6ycw3x-hivesql)
* [ROUND (Transact-SQL)](https://learn.microsoft.com/en-us/sql/t-sql/functions/round-transact-sql?view=sql-server-ver16)
* [CAST and CONVERT (Transact-SQL)](https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver16)
* [decimal and numeric (Transact-SQL)](https://learn.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-ver16)
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , and 155 others
👎  
properties (23)
authoroflyhigh
permlinkms-sql
categoryhive-105017
json_metadata{"tags":["cn","life","blog","sql","ms-sql"],"image":["https://images.hive.blog/DQmPQVkwTyjuqZgb9w6QZ7MiGRFwLS73NiNcZZiujsfsSDj/image.png","https://images.hive.blog/DQmdn4toyfd1ZSAFQLXrXJZJr7pewXztZsq7hAmG8wxpLTe/image.png","https://images.hive.blog/DQmdLx3SKdgzS3Z9enDyq6VPXH7KSM23cKS4PYFxrGJzABT/image.png","https://images.hive.blog/DQmbrxv37EVYDLsjNRdwTy9ciYrRujUMxf4gNPXpCfzwVbU/image.png","https://images.hive.blog/DQmcEAuJoMVu43eJvk2CPY1icnerZDtGkS8w3JeAi3Rh1js/image.png","https://images.hive.blog/DQmb9Ps3xL7TDvA3d8n2D6XAEcmrmFBfnrPxcjnwynjMUFx/image.png"],"links":["https://pixabay.com/photos/lightbulb-idea-creativity-base-3104355/"],"app":"hiveblog/0.1","format":"markdown"}
created2023-01-24 09:26:33
last_update2023-01-24 09:26:33
depth0
children7
last_payout2023-01-31 09:26:33
cashout_time1969-12-31 23:59:59
total_payout_value35.478 HBD
curator_payout_value35.435 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length3,111
author_reputation6,340,310,694,692,245
root_title每天进步一点点:MS-SQL保留指定位数小数
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id120,150,774
net_rshares128,282,480,180,969
author_curate_reward""
vote details (220)
@aellly ·
仔细看了很久,除了看不懂之外就剩下看不懂了。
properties (22)
authoraellly
permlinkre-oflyhigh-2023124t21538473z
categoryhive-105017
json_metadata{"tags":["cn","life","blog","sql","ms-sql"],"app":"ecency/3.0.30-vision","format":"markdown+html"}
created2023-01-24 13:05:42
last_update2023-01-24 13:05:42
depth1
children0
last_payout2023-01-31 13:05:42
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length22
author_reputation866,203,001,491,970
root_title每天进步一点点:MS-SQL保留指定位数小数
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id120,154,817
net_rshares0
@cherryzz ·
好勤快的O哥😁
properties (22)
authorcherryzz
permlinkre-oflyhigh-2023124t211126442z
categoryhive-105017
json_metadata{"tags":["cn","life","blog","sql","ms-sql"],"app":"ecency/3.0.30-vision","format":"markdown+html"}
created2023-01-24 13:11:27
last_update2023-01-24 13:11:27
depth1
children0
last_payout2023-01-31 13:11:27
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length7
author_reputation250,193,517,994,706
root_title每天进步一点点:MS-SQL保留指定位数小数
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id120,154,905
net_rshares0
@love5200 ·
如果能向O哥这么努力,估计我厦大就考上了😂
properties (22)
authorlove5200
permlinkre-oflyhigh-2023125t02711518z
categoryhive-105017
json_metadata{"tags":["cn","life","blog","sql","ms-sql"],"app":"ecency/3.0.30-vision","format":"markdown+html"}
created2023-01-24 16:27:12
last_update2023-01-24 16:27:12
depth1
children0
last_payout2023-01-31 16:27:12
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length21
author_reputation540,513,389,665,028
root_title每天进步一点点:MS-SQL保留指定位数小数
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id120,159,556
net_rshares0
@lovelingling ·
学霸都是这样的,走到哪学到哪。
properties (22)
authorlovelingling
permlinkre-oflyhigh-2023124t183915694z
categoryhive-105017
json_metadata{"tags":["hive-105017","cn","life","blog","sql","ms-sql"],"app":"ecency/3.0.19-mobile","format":"markdown+html"}
created2023-01-24 10:39:18
last_update2023-01-24 10:39:18
depth1
children0
last_payout2023-01-31 10:39:18
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length15
author_reputation726,390,445,640,163
root_title每天进步一点点:MS-SQL保留指定位数小数
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id120,152,048
net_rshares0
@marygong77777 ·
👍👍
properties (22)
authormarygong77777
permlinkparama-1674565497152
categoryhive-105017
json_metadata""
created2023-01-24 13:05:00
last_update2023-01-24 13:05:00
depth1
children0
last_payout2023-01-31 13:05:00
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length2
author_reputation408,263,235,400,602
root_title每天进步一点点:MS-SQL保留指定位数小数
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id120,154,810
net_rshares0
@marygong77777 ·
真厉害,像你学习!
properties (22)
authormarygong77777
permlinkparama-1674565691842
categoryhive-105017
json_metadata""
created2023-01-24 13:08:15
last_update2023-01-24 13:08:15
depth1
children0
last_payout2023-01-31 13:08:15
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length9
author_reputation408,263,235,400,602
root_title每天进步一点点:MS-SQL保留指定位数小数
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id120,154,861
net_rshares0
@xiaoyaodidi ·
好好学习 天天向上
properties (22)
authorxiaoyaodidi
permlinkre-oflyhigh-2023124t104217257z
categoryhive-105017
json_metadata{"tags":["hive-105017","cn","life","blog","sql","ms-sql"],"app":"ecency/3.0.36-mobile","format":"markdown+html"}
created2023-01-24 09:42:15
last_update2023-01-24 09:42:15
depth1
children0
last_payout2023-01-31 09:42:15
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length9
author_reputation420,365,988,556,456
root_title每天进步一点点:MS-SQL保留指定位数小数
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id120,151,013
net_rshares0