MySQL中从VARCHAR字段提取日期遇问题:DATE()函数返回NULL如何解决
解决MySQL中VARCHAR类型日期提取问题
这个问题我之前处理过不少次——当created_at是VARCHAR类型,存的是4/14/2018 12:00:00 AM这种格式时,直接用DATE()函数返回NULL是因为MySQL的DATE()只能识别符合标准格式的日期(比如YYYY-MM-DD),没法直接解析这种美式日期字符串。给你几个实用的解决方案:
方法一:先转成日期类型再提取
用STR_TO_DATE()函数把字符串转换成MySQL能识别的日期格式,再用DATE()提取日期部分:SELECT DATE(STR_TO_DATE(created_at, '%m/%d/%Y %h:%i:%s %p')) FROM self_balance;这里的格式符对应关系:
%m是月份(支持1位或2位),%d是日期,%Y是4位年份,%h是12小时制的小时,%i是分钟,%s是秒,%p匹配AM/PM标识。转换后再取DATE就能得到你要的4/14/2018。方法二:直接截取字符串(更高效)
如果只是需要字符串形式的日期部分,不需要转成DATE类型,可以直接通过空格分割截取前半部分:SELECT SUBSTRING_INDEX(created_at, ' ', 1) FROM self_balance;这个方法跳过了日期转换,执行速度更快,适合只需要字符串结果的场景。
方法三:彻底解决——修改列类型
从长远来看,把created_at改成DATETIME类型是最优解,这样后续所有日期相关操作都会更顺畅,还能避免格式混乱的问题。操作步骤:- 先验证所有字符串都能正常转换为DATETIME:
如果返回空结果,说明所有数据都能正确转换;如果有记录,先手动修正这些异常数据。SELECT created_at FROM self_balance WHERE STR_TO_DATE(created_at, '%m/%d/%Y %h:%i:%s %p') IS NULL; - 修改列类型:
之后再用ALTER TABLE self_balance MODIFY COLUMN created_at DATETIME;DATE(created_at)就能正常返回日期部分了。
- 先验证所有字符串都能正常转换为DATETIME:
内容的提问来源于stack exchange,提问作者user10916565
相关产品推荐
相关产品推荐

