MySQL date()函数返回含时间的结果,为何未仅返回日期?
MySQL DATE()函数在IF()中返回带时间结果的原因及解决办法
问题场景
执行以下SQL语句时,发现原本应该仅返回日期的date(now())结果,却带上了时间部分:
select if(1, date(now()), time(now())) , if(1, date(now()), 'a'), if(1, time(now()), 'b') from dual;
核心原因
MySQL的IF()函数有个关键特性:它会自动统一两个分支的返回值数据类型,取能兼容两个分支的最宽泛类型作为最终返回类型,触发隐式类型转换:
- 第一个
IF分支:date(now())是DATE类型,time(now())是TIME类型,MySQL会将DATE类型转换为DATETIME类型(因为DATETIME可以同时容纳日期和时间信息),所以date(now())会被补全为YYYY-MM-DD 00:00:00格式的DATETIME,最终显示带时间的结果。 - 第二个
IF分支:date(now())是DATE类型,'a'是字符串类型,MySQL会将DATE转换为字符串,但受IF函数的类型统一逻辑影响,也可能出现不符合预期的格式转换。
解决办法
如果需要强制返回纯日期格式的结果,要主动将DATE类型转换为字符串,避免隐式类型转换:
- 使用
DATE_FORMAT()函数指定日期格式:
select if(1, DATE_FORMAT(date(now()), '%Y-%m-%d'), time(now())) , if(1, DATE_FORMAT(date(now()), '%Y-%m-%d'), 'a'), if(1, time(now()), 'b') from dual;
- 或者用
CAST()函数直接转换为字符类型:
select if(1, CAST(date(now()) AS CHAR), time(now())) , if(1, CAST(date(now()) AS CHAR), 'a'), if(1, time(now()), 'b') from dual;
内容的提问来源于stack exchange,提问作者andy
相关产品推荐
相关产品推荐

