MySQL STR_TO_DATE格式化返回NULL问题排查求助
问题分析与解决方法
我来帮你排查这个问题——你的查询返回全NULL的核心原因是格式符和你拼接的字符串类型完全不匹配,具体来说:
MONTH(date)函数返回的是数字形式的月份(比如4对应4月,12对应12月),而你使用的格式符%M是用来匹配英文全称的月份名称(比如April、December)的。两者类型不兼容,STR_TO_DATE无法解析,自然返回NULL。- 另外补充一点:即使你解决了格式符的问题,
STR_TO_DATE返回的是DATE类型,默认会显示成YYYY-MM-DD的完整日期格式(年份会取当前会话的默认值,比如当前年份),这和你想要的04-20字符串格式也不匹配。
正确的解决方法
根据你的预期(把2019-04-20转换成04-20的字符串格式),最直接高效的方式是使用DATE_FORMAT函数,不需要手动拼接和转换:
SELECT DATE_FORMAT(date, '%m-%d') FROM `subscriptions`;
这里的格式符说明:
%m:代表两位数字的月份(01-12,自动补前导零)%d:代表两位数字的日期(01-31,自动补前导零)
如果一定要坚持用你原来的拼接思路(不推荐,因为多此一举),需要修正两个点:
- 把格式符换成匹配数字月份的
%m(两位数字)或%c(一位数字) - 给月份和日期补前导零,确保是两位数字格式:
SELECT STR_TO_DATE( CONCAT(LPAD(MONTH(date), 2, '0'), '-', LPAD(DAY(date), 2, '0')), '%m-%d' ) FROM `subscriptions`;
但注意这个查询返回的是DATE类型,会显示成YYYY-MM-DD(比如2024-04-20),如果要得到纯04-20的字符串,还是用DATE_FORMAT更合适。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

