MySQL 数据库中,订单表 tbl_test_order01 中有一列 order_at,字段类型是 int(11),表示订单金额。现在需要将 order_at 除以 1000,并保留 2 位小数。实现的 SQL 语句及查询结果如下所示:
mysql> SELECT order_at, CONVERT(order_at/1000, DECIMAL(15,2)) AS order_at1, TRUNCATE(order_at/1000, 2) AS order_at2 FROM tbl_test_order01;
+----------+-----------+-----------+
| order_at | order_at1 | order_at2 |
+----------+-----------+-----------+
| -12345 | -12.35 | -12.34 |
| 158999 | 159.00 | 158.99 |
| 565 | 0.57 | 0.56 |
| 200 | 0.20 | 0.20 |
| 590 | 0.59 | 0.59 |
| 260 | 0.26 | 0.26 |
+----------+-----------+-----------+
6 rows in set (0.00 sec)
实现方法总结:
1、DECIMAL(P, D)
MySQL DECIMAL 数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL 数据类型用于保留准确精确度的列。要定义数据类型为 DECIMAL 的列,可以使用以下语法:
column_name DECIMAL(P,D);
在上面的语法中:
- P:表示有效数字位数。P 范围为 1〜65。
- D:表示小数点后的位数。D 的范围是 0~30。MySQL 要求 D 小于或等于 (<=) P。
DECIMAL(P,D) 表示数据列可以存储 D 位小数的 P 位数。十进制列的实际范围取决于精度和刻度。例如:DECIMAL(6, 2) 最多可以存储 6 位数字,小数位数为 2 位,因此该列的范围是从 -9999.99 到 9999.99。
MySQL 允许使用以下语法:
column_name DECIMAL(P);
这相当于:
column_name DECIMAL(P,0);
在这种情况下,列不包含小数部分或小数点。
此外,我们甚至可以使用以下语法。
column_name DECIMAL;
在这种情况下,P 的默认值为10。
2、CONVERT(order_at/1000, DECIMAL(15,2))
CONVERT(order_at/1000, DECIMAL(15,2)) 可以将 order_at 除以 1000 的值,保留 2 位小数,结果四舍五入。
3、TRUNCATE(order_at/1000, 2)
TRUNCATE(order_at/1000, 2) 也可以将 order_at 除以 1000 的值,保留 2 位小数。但是结果截断到 2 个小数位,舍去法,不是四舍五入。
TRUNCATE(X,D) 是 MySQL 自带的一个系统函数。其中,X 是数值,D 是保留小数的位数。其作用就是按照小数位数,进行数值截取(此处的截取是按保留位数直接进行截取,没有四舍五入)。
数值保留规则如下:
- 当 D 大于 0,是对数值 X 的小数位数进行操作;
- 当 D 等于 0,是将数值 X 的小数部分去除,只保留整数部分;
- 当 D 小于 0,是将数值 X 的小数部分去除,并将整数部分按照 D 指定位数,用 0 替换。
函数示例如下:
- 当 X 为正数时:
SELECT TRUNCATE(123.4567, 3); # 123.456
SELECT TRUNCATE(123.4567, 2); # 123.45
SELECT TRUNCATE(123.4567, 1); # 123.4
SELECT TRUNCATE(123.4567, 0); # 123
SELECT TRUNCATE(123.4567, -1); # 120
SELECT TRUNCATE(123.4567, -2); # 100
SELECT TRUNCATE(123.4567, -3); # 0
- 当 X 为负数时:
SELECT TRUNCATE(-123.4567, 3); # -123.456
SELECT TRUNCATE(-123.4567, 2); # -123.45
SELECT TRUNCATE(-123.4567, 1); # -123.4
SELECT TRUNCATE(-123.4567, 0); # -123
SELECT TRUNCATE(-123.4567, -1); # -120
SELECT TRUNCATE(-123.4567, -2); # -100
SELECT TRUNCATE(-123.4567, -3); # 0