前言
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME、YEAR
。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
时间类型
类型 |
大小(bytes) |
范围 |
格式 |
小数点精度支持 |
用途 |
YEAR |
1 |
1901/2155 |
YYYY |
0 |
年份值 |
DATE |
3 |
1000-01-01/9999-12-31 |
YYYY-MM-DD |
0 |
日期值 |
TIME |
3 |
‘-838:59:59’/‘838:59:59’ |
HH:MM:SS |
[0,6] |
时间值或持续时间 |
DATETIME |
8 |
1000-01-01 00:00:00/9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
[0,6] |
混合日期和时间值 |
TIMESTAMP |
4 |
1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS |
[0,6] |
混合日期和时间值,时间戳 |
精度处理
时间精度定义
定义支持小数点精度的长度为6位(最大支持6位精度)
CREATE TABLE `test` (
`date` date DEFAULT NULL,
`datetime` datetime(6) DEFAULT NULL,
`timestamp` timestamp(6) NULL DEFAULT NULL,
`time` time(6) DEFAULT NULL,
`year` year(4) DEFAULT NULL
)
时间精度插入
- 插入2位,小于定义的6位,默认对缺失位补零
INSERT INTO test (DATETIME) VALUES (‘2021-04-01 10:10:10.12’)
网络异常,图片无法展示| - 插入6位,等于定义的6位,插入正常
INSERT INTO test (DATETIME) VALUES (‘2021-04-01 10:10:10.123456’)
网络异常,图片无法展示| - 插入9位,大于定义的6位,插入异常
INSERT INTO test (DATETIME) VALUES (‘2021-04-01 10:10:10.123456789’)
网络异常,图片无法展示|
当插入时间精度时,可以按照设定的精度进行插入,不要超过精度设置否则会出现异常问题,或者可以直接使用mysql函数now()
配合精度来获取时间,如now(6)
总结
- time、datetime、timestamp都支持小数点0~6的精度,year、date记录的是年份、年月日,因此不支持小数点时间精度
- datetime、timestamp都可以用来记录年月日时分秒,也支持最大6位的小数点精度,但是timestamp占用4字节存储范围较小,从系统长久使用、健壮性以及后续维护成本来说不建议使用该类型来记录时间,datetime占用8字节存储范围较大,一般我们采用datetime来进行时间数据存储,能满足大部分业务场景对时间范围、精度的最大要求
参考
MySQL TIMESTAMP 时间精度问题
MySQL Date and Time Data Type Representation
MySQL 数据类型