MySQL 日期格式化完全指南:告别时间乱码,开发直接套用

11次阅读
没有评论

在日常开发中,日期时间处理是最高频的操作之一:列表展示时间、时间范围查询、日志统计、数据归档,几乎所有业务都离不开日期格式化。

但很多小伙伴经常踩坑:数据库存的是标准时间,查出来格式五花八门、拼接字符串报错、时区错乱、年月日时分秒按需截取不会写。

今天这篇博文,一次性讲透 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 问题。

这篇文章可以收藏起来,后续开发遇到日期格式化问题,直接复制模板即可,告别重复查文档!

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码