Mysql datetime 精度缺失问题

文章讨论了在MySQL中,将13位毫秒级时间戳转换为datetime类型时可能会导致精度丢失。通过指定datetime字段为datetime(3)或更高精度,可以确保时间的毫秒级精确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一个很新奇的问题,我的数据库用的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 加上精确的位数,避免给程序留坑。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值