MySQL中date、datetime、timestamp、time、year的区别

前言

表示时间值的日期和时间类型为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 数据类型

MySQL中date、datetime、timestamp、time、year的区别_第1张图片

你可能感兴趣的:(mysql,mysql,time,datetime,date,timestamp)