dushaoshuai / dushaoshuai.github.io

https://www.shuai.host
0 stars 0 forks source link

MySQL: 时间值精度 #57

Open dushaoshuai opened 1 year ago

dushaoshuai commented 1 year ago

MySQL 支持 TIME、DATETIME、TIMESTAMP 值的小数秒,精度可达微秒(6 位数字)。

定义包含小数秒的时间类型列

语法:type(fsp),fsp 是小数秒的精度,取值范围从 0 到 6,0 意味者没有小数秒部分,默认是 0。

如下先创建一张表:

mysql> CREATE TABLE `fractest` (
    ->     `t1` TIME(2),
    ->     `t2` DATETIME(3),
    ->     `t3` TIMESTAMP(6)
    -> );
Query OK, 0 rows affected (0.01 sec)

向表中插入一行记录:

mysql> INSERT INTO `fractest` VALUES (
    -> '13:25:45.22', '2000-12-25 13:25:45.227', '2000-12-25 13:25:45.227222');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM `fractest`;
+-------------+-------------------------+----------------------------+
| t1          | t2                      | t3                         |
+-------------+-------------------------+----------------------------+
| 13:25:45.22 | 2000-12-25 13:25:45.227 | 2000-12-25 13:25:45.227222 |
+-------------+-------------------------+----------------------------+
1 row in set (0.00 sec)

可以看到插入的时间值的小数秒部分都被保存下来了。

时间值的四舍五入

当插入的时间值的小数秒部分长度超过列所定义的精度时,会导致四舍五入:

mysql> INSERT INTO `fractest` VALUES (
    -> '13:25:45.228', '2000-12-25 13:25:45.2274', '2000-12-25 13:25:45.2272225');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM `fractest` LIMIT 1 OFFSET 1;
+-------------+-------------------------+----------------------------+
| t1          | t2                      | t3                         |
+-------------+-------------------------+----------------------------+
| 13:25:45.23 | 2000-12-25 13:25:45.227 | 2000-12-25 13:25:45.227223 |
+-------------+-------------------------+----------------------------+
1 row in set (0.00 sec)

如果打开 TIME_TRUNCATE_FRACTIONAL 模式,多出来的小数部分会被截断。

函数中的小数秒

接受时间值参数的函数也接受带小数秒的时间值。

返回时间值的函数也可返回带小数秒的时间值:

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2023-03-01 22:49:03 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT NOW(6);
+----------------------------+
| NOW(6)                     |
+----------------------------+
| 2023-03-01 22:49:09.583245 |
+----------------------------+
1 row in set (0.00 sec)