为何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.948 | 2018-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
相关产品推荐
相关产品推荐

