MySQL DATE_FORMAT()函数是数据库开发中非常常用的日期时间处理函数,主要用于将日期、时间或日期时间类型的数据按照指定格式转换为字符串。无论是在报表生成、数据展示、日志分析,还是业务系统中的时间处理场景中,DATE_FORMAT()都发挥着重要作用。
掌握DATE_FORMAT()函数不仅能够提升SQL编写效率,还可以帮助开发人员灵活处理日期格式转换需求。本文将从函数语法、格式符详解、常见应用场景、实际案例以及使用注意事项等方面,对MySQL DATE_FORMAT()函数进行全面解析。
一、MySQL DATE_FORMAT()函数简介
DATE_FORMAT()是MySQL提供的日期格式化函数,可以根据用户指定的格式模板,将日期时间值转换成符合要求的字符串。
基本作用:
-
将日期转换为指定格式;
-
提取日期中的年、月、日、时、分、秒信息;
-
生成适合展示的日期字符串;
-
用于SQL查询结果格式化。
例如:
SQLSELECT DATE_FORMAT('2026-10-02', '%Y-%m-%d');
执行结果:
2026-10-02
这里%Y-%m-%d表示将日期按照“年-月-日”的形式输出。
二、DATE_FORMAT()函数语法
DATE_FORMAT()函数语法如下:
SQLDATE_FORMAT(date, format)
参数说明:
1. date
表示需要格式化的日期或时间值。
支持的数据类型包括:
-
DATE:日期类型,例如
2026-10-02 -
DATETIME:日期时间类型,例如
2026-10-02 15:30:20 -
TIMESTAMP:时间戳类型
示例:
SQLSELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
结果:
2026-10-02
2. format
表示日期格式模板,由普通字符和特殊格式控制符组成。
例如:
SQLSELECT DATE_FORMAT(NOW(), '%Y年%m月%d日');
结果:
2026年10月02日
其中:
-
%Y代表四位年份; -
%m代表月份; -
%d代表日期。
三、DATE_FORMAT()常用格式符详解
DATE_FORMAT()的核心就是格式化符号,不同符号代表不同时间信息。
1. 年份格式
| 格式符 | 说明 | 示例 |
|---|---|---|
| %Y | 四位年份 | 2026 |
| %y | 两位年份 | 26 |
示例:
SQLSELECT DATE_FORMAT('2026-10-02','%Y');
结果:
2026
2. 月份格式
| 格式符 | 说明 | 示例 |
|---|---|---|
| %m | 两位月份 | 10 |
| %c | 月份数字 | 10 |
| %M | 英文月份名称 | October |
| %b | 英文月份缩写 | Oct |
示例:
SQLSELECT DATE_FORMAT('2026-10-02','%M');
结果:
October
3. 日期格式
| 格式符 | 说明 | 示例 |
|---|---|---|
| %d | 两位日期 | 02 |
| %e | 日期数字 | 2 |
示例:
SQLSELECT DATE_FORMAT('2026-10-02','%d');
结果:
02
4. 星期格式
| 格式符 | 说明 | 示例 |
|---|---|---|
| %W | 星期名称 | Friday |
| %a | 星期缩写 | Fri |
| %w | 星期数字(0-6) | 5 |
示例:
SQLSELECT DATE_FORMAT('2026-10-02','%W');
结果:
Friday
5. 时间格式
| 格式符 | 说明 | 示例 |
|---|---|---|
| %H | 24小时制小时 | 15 |
| %h | 12小时制小时 | 03 |
| %i | 分钟 | 30 |
| %s | 秒 | 20 |
| %p | AM或PM | PM |
示例:
SQLSELECT DATE_FORMAT('2026-10-02 15:30:20','%H:%i:%s');
结果:
15:30:20
四、DATE_FORMAT()常见使用场景
1. 格式化日期显示
网站后台、管理系统中,经常需要将数据库日期转换成用户友好的格式。
例如:
数据库:
2026-10-02 15:30:20
转换为:
2026年10月02日 15:30
SQL:
SQLSELECT DATE_FORMAT(create_time,'%Y年%m月%d日 %H:%i') AS create_date FROM user;
查询结果:
2026年10月02日 15:30
2. 按月份统计数据
DATE_FORMAT()经常用于数据分析场景。
例如统计每个月订单数量:
SQLSELECT DATE_FORMAT(order_time,'%Y-%m') AS month, COUNT(*) AS total FROM orders GROUP BY DATE_FORMAT(order_time,'%Y-%m');
结果:
| month | total |
|---|---|
| 2026-01 | 120 |
| 2026-02 | 156 |
| 2026-03 | 198 |
这种方式非常适合生成月度报表。
3. 按年份统计业务数据
统计年度销售额:
SQLSELECT DATE_FORMAT(create_time,'%Y') AS year, SUM(amount) AS total_amount FROM sales GROUP BY DATE_FORMAT(create_time,'%Y');
结果:
| year | total_amount |
|---|---|
| 2025 | 500000 |
| 2026 | 680000 |
4. 查询指定日期格式的数据
例如查询某个月的数据:
SQLSELECT * FROM orders WHERE DATE_FORMAT(order_time,'%Y-%m')='2026-10';
可以查询2026年10月的所有订单。
不过这种写法会导致索引失效,数据量较大时性能较差。
更推荐:
SQLSELECT * FROM orders WHERE order_time >= '2026-10-01' AND order_time < '2026-11-01';
这种方式可以充分利用索引。
五、DATE_FORMAT()与DATE_FORMAT格式转换案例
案例1:输出完整日期时间
SQL:
SQLSELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s');
结果:
2026-10-02 23:06:30
适用于日志记录、接口返回等场景。
案例2:生成中文日期格式
SQL:
SQLSELECT DATE_FORMAT(NOW(),'%Y年%m月%d日');
结果:
2026年10月02日
适合中文业务系统展示。
案例3:获取年月
SQL:
SQLSELECT DATE_FORMAT(NOW(),'%Y%m');
结果:
202610
常用于:
-
订单编号生成;
-
月度归档;
-
数据分区。
案例4:获取季度信息
MySQL没有直接提供季度格式符,可以结合MONTH()函数实现:
SQLSELECT CONCAT( YEAR(create_time), '年第', QUARTER(create_time), '季度' ) FROM orders;
结果:
2026年第4季度
六、DATE_FORMAT()与其他日期函数区别
MySQL中还有多个日期处理函数,使用场景有所不同。
1. DATE_FORMAT()
作用:
日期转换为字符串。
示例:
SQLSELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
结果:
2026-10-02
2. STR_TO_DATE()
作用:
字符串转换为日期。
示例:
SQLSELECT STR_TO_DATE('2026-10-02','%Y-%m-%d');
结果:
2026-10-02
它与DATE_FORMAT()功能相反。
3. DATE()
作用:
获取日期部分。
示例:
SQLSELECT DATE('2026-10-02 15:30:20');
结果:
2026-10-02
4. YEAR()、MONTH()、DAY()
用于提取具体时间字段:
SQLSELECT YEAR(NOW());
结果:
2026
七、DATE_FORMAT()使用中的注意事项
1. 返回结果类型是字符串
DATE_FORMAT()返回的是字符串,而不是日期类型。
例如:
SQLSELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
返回:
2026-10-02
如果需要继续进行日期计算,应避免直接使用格式化结果。
2. 查询条件避免使用DATE_FORMAT()
错误示例:
SQLSELECT * FROM orders WHERE DATE_FORMAT(order_time,'%Y-%m-%d')='2026-10-02';
问题:
-
对字段执行函数操作;
-
无法使用索引;
-
大表查询性能下降。
推荐:
SQLSELECT * FROM orders WHERE order_time >= '2026-10-02 00:00:00' AND order_time < '2026-10-03 00:00:00';
3. 注意大小写区别
格式符严格区分大小写。
例如:
SQL%M
表示月份名称。
而:
SQL%m
表示数字月份。
两者含义完全不同。
4. 注意语言环境
%M、%W等英文名称格式默认根据MySQL语言环境输出英文。
如果需要中文显示,建议直接拼接:
SQLSELECT CONCAT( DATE_FORMAT(NOW(),'%Y年%m月%d日') );
八、DATE_FORMAT()在项目开发中的实践建议
在实际项目开发中,DATE_FORMAT()主要用于展示层处理,例如:
-
后台管理系统列表展示;
-
数据报表生成;
-
数据导出;
-
日志查看;
-
图表统计。
对于数据库查询条件,应该优先使用范围查询:
推荐:
SQLWHERE create_time >= 开始时间 AND create_time < 结束时间
避免:
SQLWHERE DATE_FORMAT(create_time,格式)=条件
这样可以兼顾查询效率和代码可维护性。
九、总结
MySQL DATE_FORMAT()函数是处理日期时间格式转换的重要工具,通过丰富的格式符,可以轻松实现日期、时间、月份、星期等信息的自定义输出。
常见使用方式包括:
-
%Y-%m-%d格式化标准日期; -
%Y-%m-%d %H:%i:%s格式化完整时间; -
按年月进行数据统计;
-
生成业务报表展示字段。
使用DATE_FORMAT()时,需要注意它返回字符串类型,并避免在大数据量查询条件中直接对字段进行格式化操作。合理使用该函数,可以提高SQL开发效率,同时保证系统查询性能。