今天遇到一个很新奇的问题,我的数据库用的mysql, 有一张表的某个字段类型为 datetime ,这个字段的值是其他服务传过来的,传参是个13位的毫秒级时间戳,将时间戳转为Date类型入库后,再次查出来时,毫秒丢失了,秒数也不太对。
先说原因:将一个字段仅声明为 datetime 类型时,入库的带毫秒的时间会被四舍五入,变为一个只精确到秒级的时间。
举个例子说明:
库表
create table t_user
(
id int auto_increment primary key,
name varchar(32) null,
age int null,
join_time datetime null
) comment '用户表';
插入记录
insert into t_user(name, age, join_time) value ('张三',18,'2023-01-02 18:42:56.234');
insert into t_user(name, age, join_time) value ('李四',19,'2023-01-02 18:42:56.765');
结果
可以看到张三的 join_time 234毫秒被砍掉了,李四的 join_time 765毫秒被进位成了1秒。datetime字段自动将毫秒级的时间四舍五入转成了秒级时间。
怎么才能让 datetime 能精确到毫秒呢?答案是将字段声明为 datetime(3)
alter table t_user modify join_time datetime(3) null;
再次插入两条记录
insert into t_user(name, age, join_time) value ('王五',18,'2023-01-02 18:42:56.234');
insert into t_user(name, age, join_time) value ('赵六',19,'2023-01-02 18:42:56.765');
结果
可以看到 如果要使 datetime 精确到我们想要的位数,就需要声明 datetime 后面还有几位,如果要精确到微秒就是 datetime(6) 。
所以我们在设计时间字段时,如果需要很精确的时间,就需要给 datetime 加上精确的位数,避免给程序留坑。