在日常开发中,日期时间处理是最高频的操作之一:列表展示时间、时间范围查询、日志统计、数据归档,几乎所有业务都离不开日期格式化。
但很多小伙伴经常踩坑:数据库存的是标准时间,查出来格式五花八门、拼接字符串报错、时区错乱、年月日时分秒按需截取不会写。
今天这篇博文,一次性讲透 MySQL 日期格式化 核心用法,包含常用函数、最全格式符、实战场景、避坑技巧,全文可直接复制用于项目开发。
一、核心前置:MySQL 两大核心日期函数
MySQL 处理日期格式化,核心就两个函数,分工明确,记住即可:
1. DATE_FORMAT():日期转字符串(查询展示用)
作用:将数据库的 datetime / date / timestamp 类型,格式化为自定义字符串格式,用于前端展示、数据导出。
语法:
DATE_FORMAT(日期字段, '格式化模板')
2. STR_TO_DATE():字符串转日期(入库查询用)
作用:将前端传入的字符串时间,转为 MySQL 可识别的 date/datetime 类型,用于条件查询、数据插入。
语法:
STR_TO_DATE(时间字符串, '格式化模板')
简单总结:查数据用 DATE_FORMAT,存数据/查条件用 STR_TO_DATE。
二、最全常用日期格式符(开发必备)
所有格式化操作,都基于以下占位符,整理了开发99%场景会用到的格式,无需死记,收藏即用:
| 格式符 | 说明 | 示例 |
|---|---|---|
| %Y | 4位完整年份 | 2026 |
| %y | 2位简写年份 | 26 |
| %m | 两位月份(01-12) | 06 |
| %c | 普通月份(1-12) | 6 |
| %d | 两位日期(01-31) | 25 |
| %e | 普通日期(1-31) | 5 |
| %H | 24小时制小时(00-23) | 18 |
| %h | 12小时制小时(01-12) | 06 |
| %i | 分钟(00-59) | 30 |
| %s | 秒(00-59) | 45 |
| %w | 星期(0=周日,6=周六) | 4 |
三、高频实战格式化模板(直接复制可用)
整理了项目中最常用的 5种日期格式,覆盖绝大部分业务场景,基于当前时间 2026-06-25 18:30:45 演示效果。
1. 标准年月日时分秒(最常用)
格式:YYYY-MM-DD HH:mm:ss
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS full_time;
输出结果:2026-06-25 18:30:45
2. 仅年月日(日期展示)
格式:YYYY-MM-DD
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS date_time;
输出结果:2026-06-25
3. 仅时分秒(时间展示)
格式:HH:mm:ss
SELECT DATE_FORMAT(NOW(), '%H:%i:%s') AS time_only;
输出结果:18:30:45
4. 中文日期格式(前台展示)
格式:YYYY年MM月DD日
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日') AS cn_time;
输出结果:2026年06月25日
5. 精简年月(月度统计)
格式:YYYY-MM
SELECT DATE_FORMAT(NOW(), '%Y-%m') AS year_month;
输出结果:2026-06
四、字符串转日期实战(查询/入库核心)
开发中经常遇到:前端传 2026-06-25 字符串,需要查询当天数据,直接匹配会报错,必须用 STR_TO_DATE 转换。
示例:字符串转日期,做时间范围查询
-- 字符串转标准date格式
SELECT STR_TO_DATE('2026-06-25', '%Y-%m-%d') AS target_date;
-- 实战查询:查询2026-06-25当天的订单
SELECT * FROM order
WHERE create_time >= STR_TO_DATE('2026-06-25', '%Y-%m-%d')
AND create_time < STR_TO_DATE('2026-06-26', '%Y-%m-%d');
💡 关键要点:格式化模板必须和字符串格式完全匹配,分隔符(- / 年/月)必须一一对应,否则返回 NULL。
错误示例(格式不匹配):
-- 字符串是/分隔,模板用-分隔,转换失败
SELECT STR_TO_DATE('2026/06/25', '%Y-%m-%d'); -- 返回 NULL
五、开发高频避坑指南
坑1:混淆 %i 和 %s
很多新手写错:%i 是分钟,%s 是秒,千万不要写反!
错误模板:%H:%s:%i(时分秒错乱)
正确模板:%H:%i:%s
坑2:格式化后无法用于时间排序
DATE_FORMAT 转换后是字符串类型,字符串排序和时间排序规则不同!
✅ 正确做法:查询展示格式化,排序、条件筛选用原始时间字段
-- 正确:展示格式化,排序用原字段
SELECT DATE_FORMAT(create_time,'%Y-%m-%d') AS show_time
FROM order
ORDER BY create_time DESC;
坑3:12小时制和24小时制混用
%H 24小时制(推荐开发全程使用),%h 12小时制,混用会导致时间错乱、数据统计错误。
坑4:忽略 NULL 值问题
如果时间字段为 NULL,DATE_FORMAT 结果也为 NULL,前端展示会空白,建议配合 IFNULL兜底:
SELECT IFNULL(DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s'), '暂无时间') AS show_time FROM order;
六、拓展:常用时间快捷函数
搭配格式化使用,开发效率翻倍:
NOW() -- 当前年月日时分秒
CURDATE() -- 当前年月日
CURTIME() -- 当前时分秒
示例:获取今日日期:
SELECT DATE_FORMAT(CURDATE(),'%Y-%m-%d') AS today;
七、文末总结
1. 核心公式:展示用 DATE_FORMAT,入参查询用 STR_TO_DATE;
2. 开发优先使用 %Y-%m-%d %H:%i:%s 标准格式,统一项目时间规范;
3. 格式化结果为字符串,禁止用于时间排序、范围比对;
4. 格式符必须与时间字符串严格匹配,避免转换 NULL 问题。
这篇文章可以收藏起来,后续开发遇到日期格式化问题,直接复制模板即可,告别重复查文档!