MySQL DATE_FORMAT()函数:日期时间格式化全解析

8 次阅读

MySQL DATE_FORMAT()函数是数据库开发中非常常用的日期时间处理函数,主要用于将日期、时间或日期时间类型的数据按照指定格式转换为字符串。无论是在报表生成、数据展示、日志分析,还是业务系统中的时间处理场景中,DATE_FORMAT()都发挥着重要作用。

掌握DATE_FORMAT()函数不仅能够提升SQL编写效率,还可以帮助开发人员灵活处理日期格式转换需求。本文将从函数语法、格式符详解、常见应用场景、实际案例以及使用注意事项等方面,对MySQL DATE_FORMAT()函数进行全面解析。

一、MySQL DATE_FORMAT()函数简介

DATE_FORMAT()是MySQL提供的日期格式化函数,可以根据用户指定的格式模板,将日期时间值转换成符合要求的字符串。

基本作用:

  • 将日期转换为指定格式;

  • 提取日期中的年、月、日、时、分、秒信息;

  • 生成适合展示的日期字符串;

  • 用于SQL查询结果格式化。

例如:

SQL
SELECT DATE_FORMAT('2026-10-02', '%Y-%m-%d');

执行结果:

2026-10-02

这里%Y-%m-%d表示将日期按照“年-月-日”的形式输出。


二、DATE_FORMAT()函数语法

DATE_FORMAT()函数语法如下:

SQL
DATE_FORMAT(date, format)

参数说明:

1. date

表示需要格式化的日期或时间值。

支持的数据类型包括:

  • DATE:日期类型,例如2026-10-02

  • DATETIME:日期时间类型,例如2026-10-02 15:30:20

  • TIMESTAMP:时间戳类型

示例:

SQL
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');

结果:

2026-10-02

2. format

表示日期格式模板,由普通字符和特殊格式控制符组成。

例如:

SQL
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日');

结果:

2026年10月02日

其中:

  • %Y代表四位年份;

  • %m代表月份;

  • %d代表日期。


三、DATE_FORMAT()常用格式符详解

DATE_FORMAT()的核心就是格式化符号,不同符号代表不同时间信息。

1. 年份格式

格式符说明示例
%Y四位年份2026
%y两位年份26

示例:

SQL
SELECT DATE_FORMAT('2026-10-02','%Y');

结果:

2026

2. 月份格式

格式符说明示例
%m两位月份10
%c月份数字10
%M英文月份名称October
%b英文月份缩写Oct

示例:

SQL
SELECT DATE_FORMAT('2026-10-02','%M');

结果:

October

3. 日期格式

格式符说明示例
%d两位日期02
%e日期数字2

示例:

SQL
SELECT DATE_FORMAT('2026-10-02','%d');

结果:

02

4. 星期格式

格式符说明示例
%W星期名称Friday
%a星期缩写Fri
%w星期数字(0-6)5

示例:

SQL
SELECT DATE_FORMAT('2026-10-02','%W');

结果:

Friday

5. 时间格式

格式符说明示例
%H24小时制小时15
%h12小时制小时03
%i分钟30
%s秒20
%pAM或PMPM

示例:

SQL
SELECT 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:

SQL
SELECT DATE_FORMAT(create_time,'%Y年%m月%d日 %H:%i') AS create_date
FROM user;

查询结果:

2026年10月02日 15:30

2. 按月份统计数据

DATE_FORMAT()经常用于数据分析场景。

例如统计每个月订单数量:

SQL
SELECT 
DATE_FORMAT(order_time,'%Y-%m') AS month,
COUNT(*) AS total
FROM orders
GROUP BY DATE_FORMAT(order_time,'%Y-%m');

结果:

monthtotal
2026-01120
2026-02156
2026-03198

这种方式非常适合生成月度报表。


3. 按年份统计业务数据

统计年度销售额:

SQL
SELECT
DATE_FORMAT(create_time,'%Y') AS year,
SUM(amount) AS total_amount
FROM sales
GROUP BY DATE_FORMAT(create_time,'%Y');

结果:

yeartotal_amount
2025500000
2026680000

4. 查询指定日期格式的数据

例如查询某个月的数据:

SQL
SELECT *
FROM orders
WHERE DATE_FORMAT(order_time,'%Y-%m')='2026-10';

可以查询2026年10月的所有订单。

不过这种写法会导致索引失效,数据量较大时性能较差。

更推荐:

SQL
SELECT *
FROM orders
WHERE order_time >= '2026-10-01'
AND order_time < '2026-11-01';

这种方式可以充分利用索引。


五、DATE_FORMAT()与DATE_FORMAT格式转换案例

案例1:输出完整日期时间

SQL:

SQL
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s');

结果:

2026-10-02 23:06:30

适用于日志记录、接口返回等场景。


案例2:生成中文日期格式

SQL:

SQL
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日');

结果:

2026年10月02日

适合中文业务系统展示。


案例3:获取年月

SQL:

SQL
SELECT DATE_FORMAT(NOW(),'%Y%m');

结果:

202610

常用于:

  • 订单编号生成;

  • 月度归档;

  • 数据分区。


案例4:获取季度信息

MySQL没有直接提供季度格式符,可以结合MONTH()函数实现:

SQL
SELECT CONCAT(
YEAR(create_time),
'年第',
QUARTER(create_time),
'季度'
)
FROM orders;

结果:

2026年第4季度

六、DATE_FORMAT()与其他日期函数区别

MySQL中还有多个日期处理函数,使用场景有所不同。

1. DATE_FORMAT()

作用:

日期转换为字符串。

示例:

SQL
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');

结果:

2026-10-02

2. STR_TO_DATE()

作用:

字符串转换为日期。

示例:

SQL
SELECT STR_TO_DATE('2026-10-02','%Y-%m-%d');

结果:

2026-10-02

它与DATE_FORMAT()功能相反。


3. DATE()

作用:

获取日期部分。

示例:

SQL
SELECT DATE('2026-10-02 15:30:20');

结果:

2026-10-02

4. YEAR()、MONTH()、DAY()

用于提取具体时间字段:

SQL
SELECT YEAR(NOW());

结果:

2026

七、DATE_FORMAT()使用中的注意事项

1. 返回结果类型是字符串

DATE_FORMAT()返回的是字符串,而不是日期类型。

例如:

SQL
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');

返回:

2026-10-02

如果需要继续进行日期计算,应避免直接使用格式化结果。


2. 查询条件避免使用DATE_FORMAT()

错误示例:

SQL
SELECT *
FROM orders
WHERE DATE_FORMAT(order_time,'%Y-%m-%d')='2026-10-02';

问题:

  • 对字段执行函数操作;

  • 无法使用索引;

  • 大表查询性能下降。

推荐:

SQL
SELECT *
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语言环境输出英文。

如果需要中文显示,建议直接拼接:

SQL
SELECT CONCAT(
DATE_FORMAT(NOW(),'%Y年%m月%d日')
);

八、DATE_FORMAT()在项目开发中的实践建议

在实际项目开发中,DATE_FORMAT()主要用于展示层处理,例如:

  • 后台管理系统列表展示;

  • 数据报表生成;

  • 数据导出;

  • 日志查看;

  • 图表统计。

对于数据库查询条件,应该优先使用范围查询:

推荐:

SQL
WHERE create_time >= 开始时间
AND create_time < 结束时间

避免:

SQL
WHERE DATE_FORMAT(create_time,格式)=条件

这样可以兼顾查询效率和代码可维护性。


九、总结

MySQL DATE_FORMAT()函数是处理日期时间格式转换的重要工具,通过丰富的格式符,可以轻松实现日期、时间、月份、星期等信息的自定义输出。

常见使用方式包括:

  • %Y-%m-%d格式化标准日期;

  • %Y-%m-%d %H:%i:%s格式化完整时间;

  • 按年月进行数据统计;

  • 生成业务报表展示字段。

使用DATE_FORMAT()时,需要注意它返回字符串类型,并避免在大数据量查询条件中直接对字段进行格式化操作。合理使用该函数,可以提高SQL开发效率,同时保证系统查询性能。