MySQL的DATE_FORMAT函数介绍
函数概述
DATE_FORMAT是MySQL中用于日期时间格式化的核心函数,支持将日期/时间值按指定格式转换为字符串。其语法为:
DATE_FORMAT(date, format)
其中date可为日期时间字段或常量,format为包含格式占位符的字符串。
语法详解
常用格式占位符
| 占位符 | 含义 | 示例值 |
|---|---|---|
| %Y | 四位数年份 | 2025 |
| %y | 两位数年份 | 25 |
| %M | 英文月份全称 | November |
| %m | 两位数月份 | 11 |
| %d | 两位数日期 | 06 |
| %D | 带后缀的日期 | 6th |
| %W | 英文星期名称 | Wednesday |
| %H | 24小时制小时 | 14 |
| %h | 12小时制小时 | 02 |
| %i | 分钟 | 30 |
| %s | 秒 | 45 |
| %p | AM/PM标识 | PM |
| %T | 完整时间格式 | 14:30:45 |
特殊格式示例
-- 中文日期格式
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); → 2025年11月06日-- 友好时间显示
SELECT DATE_FORMAT(NOW(), '%W, %M %d, %Y %h:%i %p'); → Wednesday, November 06, 2025 02:30 PM-- 季度表示
SELECT DATE_FORMAT(NOW(), 'Q%q-%Y'); → Q4-2025
实用示例
基础格式化
-- 订单日期标准化
SELECT id, DATE_FORMAT(created_at, '%Y-%m-%d') AS order_date FROM orders;-- 动态条件格式化
SELECT id, CASE WHEN created_at >= CURDATE() THEN DATE_FORMAT(created_at, '今日 %H:%i')ELSE DATE_FORMAT(created_at, '%m-%d') END AS display_time
FROM orders;
统计分析场景
-- 按月统计订单量
SELECT DATE_FORMAT(created_at, '%Y-%m') AS month, COUNT(*)
FROM orders
GROUP BY month;-- 按周统计用户活跃度
SELECT DATE_FORMAT(login_time, '%x-%v') AS week, COUNT(DISTINCT user_id)
FROM user_logs
GROUP BY week;
性能优化建议
- 索引优化:避免在WHERE子句中使用DATE_FORMAT,改用范围查询
-- 错误示例(索引失效)
SELECT * FROM orders
WHERE DATE_FORMAT(created_at, '%Y-%m') = '2025-11';-- 正确示例(使用索引)
SELECT * FROM orders
WHERE created_at BETWEEN '2025-11-01 00:00:00' AND '2025-11-30 23:59:59';
- 存储优化:对高频格式化字段可添加生成列
ALTER TABLE orders
ADD COLUMN create_date_str VARCHAR(10)
GENERATED ALWAYS AS (DATE_FORMAT(created_at, '%Y-%m-%d')) STORED;
常见问题处理
时区问题
确保MySQL服务器时区与业务需求一致:
-- 查看当前时区设置
SHOW VARIABLES LIKE '%time_zone%';-- 转换时区格式化
SELECT DATE_FORMAT(CONVERT_TZ(create_time, '+00:00', '+08:00'), '%Y-%m-%d');
特殊格式处理
-- 处理含中文分隔符的日期
SELECT DATE_FORMAT(STR_TO_DATE('2025/11/06', '%Y/%m/%d'), '%Y年%m月%d日');-- 空值处理
SELECT COALESCE(DATE_FORMAT(NULL, '%Y-%m-%d'), '暂无数据');
最佳实践
- 多语言支持:通过lc_time_names设置月份/星期显示语言
SET lc_time_names = 'zh_CN';
SELECT DATE_FORMAT(NOW(), '%M'); → 十一月
-
数据兼容:注意不同数据库格式化函数的差异,如Oracle的TO_CHAR函数
-
参数化查询:避免SQL注入,使用预编译语句
# Python示例(mysql-connector)
cursor.execute("SELECT DATE_FORMAT(%s, '%%Y-%%m-%%d')", (datetime_value,))
通过灵活运用DATE_FORMAT函数,可以实现从基础的日期显示到复杂的数据分析场景的全面支持,是MySQL日期处理中不可或缺的工具。
