MySQL函数DATE_FORMAT()日期格式转换的实现

Aria
Aria
发布时间:2026-10-15 | 4人浏览过
原创

本文将详细解析 MySQL 中强大的日期格式化函数 DATE_FORMAT() 的使用方法。内容涵盖如何将原始日期字符串标准化为 MySQL 可识别的格式,如何根据业务需求将日期输出为自定义文本(如“年月”),以及如何结合聚合函数实现按时间段统计数据。通过具体 SQL 代码演示和常用参数对照表,帮助开发者快速掌握日期格式转换的核心技巧。

结果与目标

在开发涉及时间维度的系统时,我们常需要处理非标准的日期输入,或按照特定的视觉习惯展示数据。例如,接收到的日志时间为'2011-09-20 08:30:45'这类字符串,若未转为日期对象,无法直接参与时间计算;又如用户界面希望显示“2023年10月”而非 ISO 8601 标准格式。使用 DATE_FORMAT(date, format) 可以灵活地达成这些目标。

准备条件:理解格式参数

DATE_FORMAT() 函数的核心在于第二个参数 format。它由一组预定义的特殊字符组成,每个字符对应日期的某一部分。在编写 SQL 前,熟悉以下关键符号至关重要:

  • %Y: 四位数年份 (如 2011)
  • %y: 两位数年份 (如 11)
  • %m: 月份数值,带前导零 (01...12)
  • %c: 月份数值,无前导零 (1...12)
  • %d: 当月天数,带前导零 (00...31)
  • %H: 24小时制小时 (00...23)
  • %h / %I: 12小时制小时 (01...12)
  • %i: 分钟,带前导零 (00...59)
  • %s / %S: 秒,带前导零 (00...59)
  • %M: 完整的月份名称 (January...December)
  • %W: 完整的星期名称 (Sunday...Saturday)
  • %%: 字面上的百分号字符

其他不常用的完整参数参考如下:

%a 缩写星期名(Sun……Sat)
%b 缩写月名
%D 带有英文前缀的天 (1st, 2nd)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%k 小时 (0-23)
%l 小时 (1-12)
%p AM 或 PM
%r 12小时时间格式(hh:mm:ss AM/PM)
%T 24小时时间格式(hh:mm:ss)
%U 周数(周日为第一天)
%u 周数(周一为第一天)
%V 周数(与%X搭配,周日为第一天)
%v 周数(与%x搭配,周一为第一天)
%w 周的天数(0=星期日, 6=星期六)
%X 年值(周日为第一天), 4位
%x 年值(周一为第一天), 4位
%% 文字"%"

真实操作顺序

第1步:将字符串转换为标准日期格式

如果你有一个类似'2011-09-20 08:30:45'的文本,虽然看起来像日期,但在某些严格的比较场景下,显式转换更安全。利用DATE_FORMAT将其重排为标准格式:

SELECT DATE_FORMAT('2011-09-20 08:30:45', '%Y-%m-%d %H:%i:%S');

注意:MySQL 内部通常已能自动隐式转换此类标准字符串,但显示格式化有助于统一输出规范。如果是Oracle环境,则需使用to_date()和to_char(),如SELECT to_date('2011-09-20 08:30:45', 'yyyy-MM-dd hh24:mi:ss') FROM dual;。以下聚焦于MySQL实现。

第2步:将当前日期转为指定格式的字符串

要在报表或前端展示中自定义日期样式,可以将NOW()(获取当前时间)传入函数:

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

这会返回如2023-10-27 14:30:05这样的字符串。你也可以改为中文风格,例如'%Y年%m月%d日'。

第3步:在实际数据库表中格式化并统计

这是最典型的应用场景。假设有一张日记表t_diary,字段releaseDate记录了发布时间。如果我们需要统计每个月发布了多少篇日记,并按“XXXX年XX月”的格式返回:

首先查看原始数据源结构:

执行分组查询:

SELECT 
    DATE_FORMAT(releaseDate,'%Y年%m月') AS releaseDateStr,
    COUNT(*) AS diaryCount 
FROM t_diary 
GROUP BY DATE_FORMAT(releaseDate,'%Y年%m月');

原理解析:

  1. GROUP BY 后面的表达式必须与 SELECT 中的别名表达式逻辑一致。这里都用 DATE_FORMAT(releaseDate,'%Y年%m月')。
  2. MySQL 会先提取每一行的日期,将其格式化为如“2023年10月”的字符串。
  3. 然后对相同字符串的行进行计数聚合。

查询后的结果集如下所示:

这样便得到了以“年月”为单位的数据分布概览。

完成判断与简要总结

通过以上三个步骤,你已经掌握了 DATE_FORMAT() 的基本语法及其在处理不同粒度时间数据时的应用。验证方法很简单:直接在数据库客户端运行示例 SQL,观察返回值的格式是否符合预期。该函数的强大之处在于其极高的灵活性,只需调整第二参数的占位符排列,即可适应绝大多数业务展示需求。

以上就是MySQL函数DATE_FORMAT()日期格式转换的详细实现过程与方法,更多关于MySQL时间处理与数据分析的技巧请持续关注本站后续文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表