date_format是mysql中唯一内置的日期格式化函数,用于将日期转为指定字符串格式,如'%y-%m-%d'输出“2024-03-15”,%e/%b/%y输出“15/mar/2024”;对null返回null,非法日期在严格模式下直接报错;需配合str_to_date实现字符串转日期再格式化;不可在where中使用,否则导致索引失效。

DATE_FORMAT函数的基本用法和常见格式符
MySQL里想把日期字段转成“2024-03-15”或“15/Mar/2024”这类可读形式,DATE_FORMAT是唯一直接可用的内置方案。它不改变原始值,只控制显示样式。
核心是第二个参数——格式字符串。常用符号有:%Y(4位年)、%y(2位年)、%m(01–12)、%c(1–12,无前导零)、%d(01–31)、%e(1–31)、%M(英文全称,如January)、%b(英文缩写,如Jan)。
-
SELECT DATE_FORMAT('2024-03-15', '%Y-%m-%d')→'2024-03-15' -
SELECT DATE_FORMAT('2024-03-15', '%e/%b/%Y')→'15/Mar/2024' -
SELECT DATE_FORMAT(NOW(), '%H:%i:%s')→ 当前时间的时分秒(24小时制)
处理NULL值和非法日期时的行为
DATE_FORMAT对NULL输入直接返回NULL,不会报错,这点很安全;但若传入非法日期(比如'2024-02-30'),MySQL在严格模式下会先报错Incorrect date value,根本进不到DATE_FORMAT这步。
- 查表前先用
IS NOT NULL或COALESCE兜底,例如:DATE_FORMAT(COALESCE(created_at, '1970-01-01'), '%Y年%m月%d日') - 避免用字符串拼日期再传给
DATE_FORMAT,比如DATE_FORMAT('2024/03/15', '%Y-%m-%d')可能因格式不匹配返回NULL(MySQL会尝试隐式转换,但不可靠) - 确认字段类型是
DATE、DATETIME或TIMESTAMP,别用VARCHAR存日期
与STR_TO_DATE配合做双向转换
DATE_FORMAT只负责“输出格式化”,如果要从字符串解析成日期再格式化,得先用STR_TO_DATE转成合法日期类型。
- 错误写法:
DATE_FORMAT('15/03/2024', '%Y-%m-%d')→ 返回NULL(因为输入不是日期类型) - 正确写法:
DATE_FORMAT(STR_TO_DATE('15/03/2024', '%d/%m/%Y'), '%Y-%m-%d')→'2024-03-15' -
STR_TO_DATE的格式符必须和输入字符串严格对应,'%d/%m/%Y'不能写成'%m/%d/%Y',否则结果为NULL
性能和索引影响必须注意
DATE_FORMAT是逐行计算的函数,出现在WHERE子句里会强制全表扫描,哪怕字段上有索引也用不上。
- 别这么写:
WHERE DATE_FORMAT(create_time, '%Y-%m') = '2024-03' - 应该改用范围查询:
WHERE create_time >= '2024-03-01' AND create_time - 如果真需要按格式分组统计,
GROUP BY DATE_FORMAT(create_time, '%Y-%m')可以接受,但要注意结果集大时仍可能慢
格式化逻辑尽量放在应用层做,数据库只管结构化存储和高效筛选。真正卡住性能的,往往不是DATE_FORMAT本身,而是它诱使你写出无法走索引的条件。











