You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何MySQL SUBDATE(now(3),2)函数会追加三位毫秒零?如何去除?

为什么MySQL中@intervalStartDate末尾多出三位零?如何去除?

咱们先还原你的场景哈:
你执行了这段MySQL代码:

set @currentdatetime:=now(3);
set @intervalStartDate:=subdate(@currentdatetime, 2);
select @currentdatetime, @intervalStartDate;

得到的输出是:

@currentdatetime@intervalStartDate
2018-04-15 13:02:32.9482018-04-13 13:02:32.948000

为啥会多出这三个零?

说白了就是MySQL里日期时间类型的精度不匹配搞的鬼:

  • 你用now(3)生成的@currentdatetime是DATETIME(3)类型,只保留3位毫秒数;
  • 但SUBDATE()函数处理这种带精度的日期时,默认会返回DATETIME(6)类型(MySQL支持的最高精度是6位小数),所以就自动给你原本的3位小数后面补了三个零,凑够6位,于是就出现了.948000这个结果。

怎么去掉这些零?

给你三种实用的解决办法,按需选择就行:

1. 直接格式化输出(适合用来展示结果)

用DATE_FORMAT()函数指定输出格式,只保留3位小数:

set @currentdatetime:=now(3);
set @intervalStartDate:=subdate(@currentdatetime, 2);
-- 精确指定保留3位毫秒数
select @currentdatetime, DATE_FORMAT(@intervalStartDate, '%Y-%m-%d %H:%i:%s.%3f') as intervalStartDate;

这样输出的结果就会和@currentdatetime格式完全一致。

2. 转换为同精度的日期类型(适合后续还要用来计算的场景)

用CONVERT()把SUBDATE的结果转换成DATETIME(3)类型,从根源上统一精度:

set @currentdatetime:=now(3);
set @intervalStartDate:=CONVERT(subdate(@currentdatetime, 2), DATETIME(3));
select @currentdatetime, @intervalStartDate;

这样变量本身的类型就和@currentdatetime一致了,后续不管怎么用都不会出现多余的零。

3. 改用TIMESTAMP类型(如果业务场景允许)

TIMESTAMP类型默认精度就是3位,要是你不需要6位精度的话,可以直接转成这个类型:

set @currentdatetime:=now(3);
set @intervalStartDate:=CAST(subdate(@currentdatetime, 2) AS TIMESTAMP(3));
select @currentdatetime, @intervalStartDate;

这几种方法都能轻松去掉末尾的三个零,你挑最适合你业务场景的用就行~


内容的提问来源于stack exchange,提问作者bhagat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:55:37