MySQL里那些时间函数到底怎么用,弄懂了数据库操作轻松多了
- 问答
- 2026-01-14 20:55:32
- 1
知乎专栏《数据库实战宝典》)
MySQL里的时间函数就像你的生活小助手,帮你轻松处理各种和时间相关的操作,想象一下,你要统计上个月的订单、计算会员有效期,或者显示用户最后登录时间,这些全靠它们,下面我就用大白话讲讲最常用的几个函数,保证你听完就能用上。
获取当前时间:NOW() 和 SYSDATE()
这俩就像你手机上的时钟。NOW() 返回的是SQL语句开始执行时的时间,而SYSDATE()返回的是函数被调用时的实时时间,比如你执行一个耗时查询,NOW()会始终显示开始时间,但SYSDATE()会随着查询进行变化,不过大部分情况下,你可以把它俩当成一样的用,还有个CURDATE()只取日期部分(比如2023-10-01),CURTIME()只取时间部分(比如14:30:25),按需选用就行。
提取时间部分:DATE()和TIME()
如果你的数据是完整的日期时间格式(如2023-10-01 14:30:25),但只想看日期或时间,用这两个函数就能快速剥离,比如DATE('2023-10-01 14:30:25')会返回2023-10-01,适合做按天分组的统计。

智能加减时间:DATE_ADD()和DATE_SUB()
(来源:MySQL官方手册示例)这是最实用的时间计算器,比如你要查30天内的订单,不用掰手指算日期,直接写WHERE order_date >= DATE_SUB(NOW(), INTERVAL 30 DAY),这里的INTERVAL是个时间间隔关键字,后面可以跟DAY、MONTH、YEAR甚至HOUR_MINUTE(如INTERVAL '2:30' HOUR_MINUTE表示2小时30分钟),加时间就把SUB换成ADD,比如给会员卡加一年有效期:DATE_ADD(start_date, INTERVAL 1 YEAR)。
计算时间差:DATEDIFF()和TIMESTAMPDIFF()
DATEDIFF(date1, date2)只计算两个日期相差的天数(忽略时间部分),比如算会员注册了多久:DATEDIFF(NOW(), signup_date),如果你需要更精确的差异,比如相差多少小时或分钟,就用TIMESTAMPDIFF(unit, start, end),其中unit可以是HOUR、MINUTE等,比如计算工单处理时长(小时):TIMESTAMPDIFF(HOUR, create_time, finish_time)。
格式化时间:DATE_FORMAT()
(来源:Stack Overflow高赞案例)这个函数能把死板的数据库格式变成你想要的任何样子,比如created_at字段显示为"2023年10月01日":

SELECT DATE_FORMAT(created_at, '%Y年%m月%d日') FROM orders;
常用占位符:%Y四位数年,%m两位数月,%d两位数日,%H24小时制时,%i分,国外常用的"October 01, 2023"格式对应'%M %d, %Y'。
时间戳转换:UNIX_TIMESTAMP()和FROM_UNIXTIME()
如果你数据库里存的是时间戳(一堆数字),FROM_UNIXTIME(1598889600)可以把它转成正常时间;反过来UNIX_TIMESTAMP('2023-10-01')能把日期转成时间戳,做跨系统数据对接时特别有用。
实际应用场景举例
- 清理过期数据:
DELETE FROM logs WHERE create_time < DATE_SUB(NOW(), INTERVAL 1 YEAR) - 生成月度报告:
SELECT DATE_FORMAT(create_time, '%Y-%m') as month, COUNT(*) FROM orders GROUP BY month - 计算平均响应时长:
SELECT AVG(TIMESTAMPDIFF(MINUTE, query_time, reply_time)) FROM customer_service
最后提醒个小坑:处理跨时区业务时,最好用UTC_TIMESTAMP()获取标准时间,避免服务器时区变更导致数据错乱,这些函数组合起来用,就能解决90%的时间处理问题,试试在查询里套用它们,你会发现SQL原来这么灵活。
本文由水靖荷于2026-01-14发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/80759.html
