date_format是mysql专属日期格式化函数,将日期转为字符串,语法为date_format(date, format),结果不可直接用于日期计算;需注意大小写敏感、%y与%y等易错格式符,并避免在排序筛选中使用。

MySQL里DATE_FORMAT函数怎么用?
DATE_FORMAT 是 MySQL 专属的日期格式化函数,不能直接在 PostgreSQL、SQL Server 或 SQLite 里用。如果你在非 MySQL 环境下看到这个函数报错,不是写错了,是压根不支持。
它的核心作用是把 DATE、DATETIME 或 TIMESTAMP 类型的值,按指定模板转成字符串。注意:结果是字符串,不是日期类型,不能再直接参与日期计算或比较(除非再转回去)。
基本语法:DATE_FORMAT(date, format),其中 date 是日期表达式,format 是带占位符的字符串,比如 '%Y-%m-%d'。
常用格式符有哪些?哪些容易写错?
MySQL 的格式符大小写敏感,且部分符号含义反直觉。最常踩的坑是把 %y(两位年份)和 %Y(四位年份)弄混,或者误用 %h(12小时制小时)而不是 %H(24小时制)。
-
%Y→ 四位年份(如2024),%y→ 两位年份(如24) -
%m→ 两位月份(01–12),%c→ 不补零月份(1–12) -
%d→ 两位日期(01–31),%e→ 不补零日期(1–31) -
%H→ 24小时制小时(00–23),%h或%I→ 12小时制(01–12) -
%i→ 分钟(00–59),别写成%m(那是月份) -
%s→ 秒(00–59),不是字符串缩写
示例:DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i') 返回类似 2024年04月22日 15:30 的字符串。
DATE_FORMAT能处理NULL或非法日期吗?
不能。如果传入 NULL,结果就是 NULL;如果传入非法日期(如 '2024-02-30'),MySQL 在严格模式下会报错 Incorrect date value,非严格模式可能转成 '0000-00-00' 再格式化,结果不可靠。
安全做法是加判断:
SELECT
CASE
WHEN order_date IS NULL THEN '未知日期'
WHEN order_date = '0000-00-00' THEN '日期无效'
ELSE DATE_FORMAT(order_date, '%Y/%m/%d')
END AS formatted_date
FROM orders;
另外,DATE_FORMAT 对时区不敏感——它只按字段存储的值格式化,不会自动转当前会话时区。如果字段存的是 UTC 时间但你希望按本地时间显示,得先用 CONVERT_TZ 转换,再格式化。
替代方案:其他数据库怎么实现类似功能?
PostgreSQL 没有 DATE_FORMAT,用 TO_CHAR(date, 'YYYY-MM-DD HH24:MI');SQL Server 用 FORMAT(date, 'yyyy-MM-dd HH:mm')(2012+)或 CONVERT 配风格码;SQLite 用 strftime('%Y-%m-%d', date)。这些函数名、占位符、大小写规则全都不一样,跨库迁移时必须重写。
更隐蔽的坑是:MySQL 的 DATE_FORMAT 在 GROUP BY 或 ORDER BY 中使用时,如果格式化后字符串排序不符合预期(比如按 '2024-01' 排序没问题,但按 '一月2024' 就乱),本质是因为你排序的是字符串,不是日期本身。
真正需要排序或筛选时,优先用原生日期字段操作,仅在最终展示层才格式化。










