"这个报表需要显示'2025-07-15'为'7月15日 周二'格式..."
—— 每个程序员都遇到过的灵魂拷问 😅
在数据库操作中,日期处理就像厨房里的盐——看似不起眼,但少了它所有菜都会走味,今天我们就来聊聊MySQL中那些让日期数据"色香味俱全"的格式化函数!
想象你正在开发:
原生日期格式2025-07-15 14:30:00
显然不能满足这些需求,这时候就需要我们的格式化函数登场了!
最灵活的日期格式化函数,像乐高一样随心组合:
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS 基础格式, -- 2025-07-15 DATE_FORMAT(NOW(), '%b %d %Y') AS 英文简写, -- Jul 15 2025 DATE_FORMAT(NOW(), '%Y年%m月%d日') AS 中文日期, -- 2025年07月15日 DATE_FORMAT(NOW(), '%W %M %Y') AS 完整星期 -- Tuesday July 2025 FROM dual;
常用格式符号大全:
| 符号 | 说明 | 示例 |
|------|-----------------------|-------------|
| %Y | 四位年份 | 2025 |
| %y | 两位年份 | 25 |
| %m | 月份(01-12) | 07 |
| %c | 月份(1-12) | 7 |
| %M | 英文月份名 | July |
| %b | 缩写月份名 | Jul |
| %d | 日期(01-31) | 15 |
| %e | 日期(1-31) | 15 |
| %H | 24小时制小时 | 14 |
| %h | 12小时制小时 | 02 |
| %i | 分钟(00-59) | 30 |
| %s | 秒数(00-59) | 45 |
| %p | AM/PM | PM |
| %W | 星期名 | Tuesday |
| %a | 缩写星期名 | Tue |
当时你只关心时间部分时:
SELECT TIME_FORMAT('14:30:45', '%H:%i') AS 简单时间, -- 14:30 TIME_FORMAT('14:30:45', '%h:%i %p') AS 12小时制 -- 02:30 PM FROM dual;
把杂乱无章的字符串变成标准日期:
SELECT STR_TO_DATE('07/15/2025', '%m/%d/%Y') AS 美式日期, STR_TO_DATE('2025年7月15日', '%Y年%m月%d日') AS 中文解析 FROM dual;
-- 显示"发布于:7月15日 周二 下午2:30" SELECT CONCAT( '发布于:', DATE_FORMAT(create_time, '%c月%e日 %a '), TIME_FORMAT(create_time, '%h:%i %p') ) AS post_time FROM articles;
-- 输出"2025-Q3" SELECT CONCAT( YEAR(sale_date), '-Q', QUARTER(sale_date) ) AS sale_quarter FROM sales;
-- 显示"还剩3天12小时" SELECT CONCAT( '还剩', DATEDIFF(expire_date, CURDATE()), '天', HOUR(TIMEDIFF(expire_date, NOW())), '小时' ) AS countdown FROM promotions;
时区陷阱:
NOW()
取服务器时间,UTC_TIMESTAMP()
取UTC时间,跨国业务要特别注意
性能注意:
在WHERE条件中对日期列使用函数会导致索引失效:
-- ❌ 错误示范(无法使用索引) SELECT * FROM orders WHERE DATE_FORMAT(create_time,'%Y-%m')='2025-07'; -- ✅ 正确做法 SELECT * FROM orders WHERE create_time BETWEEN '2025-07-01' AND '2025-07-31';
语言环境:
星期/月份名称显示取决于MySQL的lc_time_names系统变量,想显示中文需要设置:
SET lc_time_names = 'zh_CN'; SELECT DATE_FORMAT(NOW(), '%W %M'); -- 输出"星期二 七月"
快速获取本月第一天:
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE())-1 DAY), '%Y-%m-%d');
计算年龄:
SELECT TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age FROM users;
生成时间序列:
SELECT DATE_ADD('2025-07-01', INTERVAL seq DAY) AS date_seq FROM ( SELECT 0 AS seq UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 -- 持续到需要的天数 ) numbers;
💡 好的日期处理就像隐形的好服务——用户不会注意到它,但糟糕的实现一定会被投诉!
下次当你的应用需要显示"3天前"、"下周日下午"或"2025财年Q3"时,希望这些函数能成为你的得力助手~ 🚀
本文由 窦晶滢 于2025-07-30发表在【云服务器提供商】,文中图片由(窦晶滢)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/486086.html
发表评论