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

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类型是最优解,这样后续所有日期相关操作都会更顺畅,还能避免格式混乱的问题。操作步骤:

    1. 先验证所有字符串都能正常转换为DATETIME:
      SELECT created_at FROM self_balance WHERE STR_TO_DATE(created_at, '%m/%d/%Y %h:%i:%s %p') IS NULL;
      
      如果返回空结果,说明所有数据都能正确转换;如果有记录,先手动修正这些异常数据。
    2. 修改列类型:
      ALTER TABLE self_balance MODIFY COLUMN created_at DATETIME;
      
      之后再用DATE(created_at)就能正常返回日期部分了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:52:21