SQL如何将日期转换为特定格式?DATE_FORMAT函数详解
SQL如何将日期转换为特定格式?DATE_FORMAT函数详解

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
MySQL里DATE_FORMAT函数怎么用?
开门见山,DATE_FORMAT是MySQL的“独家”函数。如果你在PostgreSQL、SQL Server或者SQLite里直接调用它,系统报错可不是因为你写错了,而是它压根就不存在——这是数据库方言的差异,迁移代码时尤其要留心。
这个函数的核心任务很明确:把DATE、DATETIME或TIMESTAMP这类日期时间值,按照你指定的“模板”,转换成一个格式规整的字符串。这里有个关键点必须强调:转换结果是字符串,不再是日期类型。这意味着,它不能直接拿去做日期计算或者比较,除非你再把它转换回去。
它的基本语法相当直观:DATE_FORMAT(date, format)。其中,date就是你要处理的日期表达式,而format则是一个包含特定占位符的字符串模板,比如我们最熟悉的‘%Y-%m-%d’。
常用格式符有哪些?哪些容易写错?
使用DATE_FORMAT时,格式符是重中之重,而且这里有几个“坑”新手很容易掉进去。首先,MySQL的格式符是大小写敏感的,大小写不同,含义天差地别。最经典的混淆就是把%y(两位年份)和%Y(四位年份)搞混,或者在需要24小时制的时候误用了%h(12小时制)。
下面这些是日常开发中最常用、也最需要仔细区分的格式符:
%Y→ 四位年份(例如2024),%y→ 两位年份(例如24)%m→ 补零的两位月份(01–12),%c→ 不补零的月份(1–12)%d→ 补零的两位日期(01–31),%e→ 不补零的日期(1–31)%H→ 24小时制的小时(00–23),%h或%I→ 12小时制(01–12)%i→ 分钟(00–59),千万别写成%m(那是月份)%s→ 秒(00–59),它代表秒数,不是字符串的缩写
举个例子:DATE_FORMAT(NOW(), ‘%Y年%m月%d日 %H:%i’) 会返回像 “2024年04月22日 15:30” 这样的中文字符串,非常适合报表展示。
DATE_FORMAT能处理NULL或非法日期吗?
很遗憾,它不能“智能”处理异常值。如果传入的日期是NULL,那么结果也是NULL。如果传入一个非法日期,比如‘2024-02-30’,事情就有点棘手了:在MySQL的严格SQL模式下,它会直接报错Incorrect date value;而在非严格模式下,它可能会先被转换成‘0000-00-00’这样的零值,再进行格式化,最终结果自然是不可靠的。
因此,在生产环境中,更安全的做法是加上条件判断:
SELECT
CASE
WHEN order_date IS NULL THEN ‘未知日期’
WHEN order_date = ‘0000-00-00’ THEN ‘日期无效’
ELSE DATE_FORMAT(order_date, ‘%Y/%m/%d’)
END AS formatted_date
FROM orders;
另外,还有一个容易被忽略的特性:DATE_FORMAT 对时区不敏感。它只会按照字段里存储的原始值进行格式化,不会自动转换为当前会话的时区。如果你的数据库里存的是UTC时间,但希望按北京时间显示,正确的步骤是先用CONVERT_TZ函数转换时区,然后再进行格式化。
替代方案:其他数据库怎么实现类似功能?
既然DATE_FORMAT是MySQL专属,那在其他数据库里该怎么办呢?答案是各有各的“方言”。
PostgreSQL使用的是TO_CHAR(date, ‘YYYY-MM-DD HH24:MI’);SQL Server(2012及以上版本)推荐使用FORMAT(date, ‘yyyy-MM-dd HH:mm’),老版本则常用CONVERT函数配合风格码;SQLite则用strftime(‘%Y-%m-%d’, date)。这些函数的名称、占位符语法乃至大小写规则都完全不同,跨数据库迁移时,这部分代码基本都需要重写。
最后,再提一个更隐蔽的陷阱:当你把DATE_FORMAT的结果用于GROUP BY或ORDER BY子句时,实际上是在对格式化后的字符串进行排序。如果格式像‘2024-01’这样本身具有顺序性,那可能没问题;但如果格式是‘一月2024’,排序结果很可能不符合你的日期逻辑预期。
所以,记住一个最佳实践:凡是涉及到排序、筛选或分组的逻辑,尽量使用原生的日期时间字段进行操作。DATE_FORMAT这类函数,最好只用在最终的结果展示层。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
mysql怎么用函数实现多字节字符的截取_使用SUBSTRING与CHARACTER_LENGTH
MySQL 中 SUBSTRING 截取中文乱码?本质是字节 vs 字符混淆 核心问题在于:SUBSTRING 函数默认按字节进行截取。在 utf8mb4 编码下,一个中文字符通常占用 3 到 4 个字节。若错误地使用返回字节数的 LENGTH() 函数来配合 SUBSTRING 操作,极易截取到半
如何在Navicat中使用自定义模型节点颜色样式_架构师必备技能
Na vicat 数据库模型节点颜色:自定义的真相与替代方案 在数据库设计和团队协作中,ER图(实体关系图)的可视化效果至关重要。清晰的色彩区分能快速传达表类型、模块归属或状态信息。然而,如果你正在使用 Na vicat 的建模工具,并试图寻找自定义节点颜色的方法,那么有一个事实需要先明确:这个功能
mysql如何处理从库自增ID与主库不一致_解析自增锁模式
从库AUTO_INCREMENT值比主库小?深度解析与根治方案 在MySQL主从复制架构中,你是否遇到过这样的困惑:从库表的自增ID起始值,莫名其妙地比主库小了一截?这可不是个小问题,它像一颗定时冲击波,一旦触发写入,就可能引发主键冲突和数据混乱。今天,我们就来彻底拆解这个问题的根源,并给出安全、可
MongoDB 6.0副本集如何实现跨机房部署_配置节点优先级priority与地理位置感知
MongoDB 6 0副本集如何实现跨机房部署_配置节点优先级priority与地理位置感知 跨机房部署时,priority 配置不等于“强制主节点” 这里有个常见的理解误区:以为只要把某个节点的 priority 值调高,它就能在跨机房部署中稳坐主节点之位。事实并非如此。副本集的选举,是一场由 p
mysql触发器中如何判断字段是否被修改_在UPDATE触发器中对比NEW和OLD
MySQL触发器里,如何精准判断字段值是否真的被修改了? 在数据库维护中,我们常常需要在数据变更时触发一些动作,比如记录日志、更新冗余字段。一个看似简单的需求——判断某个字段在UPDATE前后是否发生了变化——却藏着不少“坑”。直接比较NEW column_name != OLD column_na
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

