目录
时间是数据的一种类型
🧰 MySQL 常用时间函数大全
🟦 1. 获取当前时间/日期
🟦 2. 日期运算(加减)
🟦 3. 时间差计算
🟦 4. 格式化日期
🟦 5. 提取时间部分
🟦 6. 时间戳相关
函数之间的联系
时间是数据的一种类型
我们用 MySQL 存储时间,其实和存储数字、字符串一样,时间是 一类特殊的数据类型(DATE
/ DATETIME
/ TIMESTAMP
)。
所以我们要处理它,比如:
-
现在是什么时间?(取值)
-
某个时间加上 3 天是多少?(运算)
-
两个时间差多少?(对比)
-
显示成“年-月-日”?(格式化)
于是我们需要一类“时间函数工具箱”来完成这些任务。
🧰 MySQL 常用时间函数大全
🟦 1. 获取当前时间/日期
函数名 | 中文含义 | 示例 | 返回 |
---|---|---|---|
NOW() | 当前日期和时间 | SELECT NOW(); | 2025-05-08 20:21:00 |
CURDATE() | 当前日期(不包括时间) | SELECT CURDATE(); | 2025-05-08 |
CURTIME() | 当前时间(不包括日期) | SELECT CURTIME(); | 20:21:00 |
适用场景:记录操作时间、筛选“今天”的数据、判断是否超期。
🟦 2. 日期运算(加减)
函数名 | 中文含义 | 示例 | 返回 |
---|---|---|---|
DATE_ADD(d, INTERVAL n unit) | 某日期加上时间间隔 | DATE_ADD('2024-01-01', INTERVAL 3 DAY) | 2024-01-04 |
DATE_SUB(d, INTERVAL n unit) | 某日期减去时间间隔 | DATE_SUB('2024-01-10', INTERVAL 1 MONTH) | 2023-12-10 |
-
unit
可以是DAY
,MONTH
,YEAR
,HOUR
,MINUTE
等。
适用场景:查“过去 7 天”/“近 1 个月”的记录。
DATE_ADD(date, INTERVAL expr unit)
-
功能:给日期加上指定的时间间隔。
-
语法:
SELECT DATE_ADD('2025-05-13', INTERVAL 10 DAY); -- 加10天
DATE_SUB(date, INTERVAL expr unit)
-
功能:从日期中减去时间间隔。
-
语法:
SELECT DATE_SUB('2025-05-13', INTERVAL 1 MONTH); -- 减1个月
🟦 3. 时间差计算
函数名 | 中文含义 | 示例 | 返回 |
---|---|---|---|
DATEDIFF(d1, d2) | d1 - d2 相差多少天(整数) | DATEDIFF('2025-05-10', '2025-05-01') | 9 |
TIMESTAMPDIFF(unit, d1, d2) | 相差多少单位(更灵活) | TIMESTAMPDIFF(MONTH, '2023-01-01', '2025-05-01') | 28 |
-
unit
也可以是SECOND
,MINUTE
,HOUR
,DAY
,MONTH
,YEAR
适用场景:计算会员时长、距离到期还有几天、是否超时。
DATEDIFF(date1, date2)
-
功能:计算两个日期之间的天数差值(date1 - date2)。
-
语法:
SELECT DATEDIFF('2025-05-13', '2025-05-01'); -- 返回 12
TIMESTAMPDIFF(unit, datetime1, datetime2)
-
功能:计算两个时间之间的差值,可指定单位(
SECOND
,MINUTE
,HOUR
,DAY
,MONTH
,YEAR
)。 -
语法:
SELECT TIMESTAMPDIFF(DAY, '2025-05-01', '2025-05-13'); -- 返回 12
🟦 4. 格式化日期
函数名 | 中文含义 | 示例 | 返回 |
---|---|---|---|
DATE_FORMAT(d, format) | 格式化时间 | DATE_FORMAT(NOW(), '%Y-%m-%d') | 2025-05-08 |
适用场景:前端展示、日志格式化、分组查询(比如按月统计)。
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
常用格式符号:
符号 | 含义 |
---|---|
%Y | 四位数年份(2025) |
%y | 两位数年份(25) |
%m | 月份(01–12) |
%d | 日期(01–31) |
%H | 小时(00–23) |
%i | 分钟(00–59) |
%s | 秒(00–59) |
🟦 5. 提取时间部分
函数名 | 中文含义 | 示例 | 返回 |
---|---|---|---|
YEAR(d) | 提取年份 | YEAR(NOW()) | 2025 |
MONTH(d) | 提取月份 | MONTH('2024-08-15') | 8 |
DAY(d) | 提取日期 | DAY('2025-05-08') | 8 |
HOUR(d) | 小时 | HOUR('20:15:00') | 20 |
适用场景:按年月日分组、按小时分布分析。
YEAR(date)
-
功能:提取年份。
-
语法:
SELECT YEAR('2025-05-13'); -- 返回 2025
DAY(date)
或 DAYOFMONTH(date)
-
功能:提取日期中的“日”部分。
-
语法:
SELECT DAY('2025-05-13'); -- 返回 13
HOUR(time)
/ MINUTE(time)
/ SECOND(time)
-
功能:提取时间的时、分、秒。
-
示例:
SELECT HOUR('14:32:10'); -- 返回 14
SELECT MINUTE('14:32:10'); -- 返回 32
SELECT SECOND('14:32:10'); -- 返回 10
🟦 6. 时间戳相关
时间戳(Timestamp)是指从一个特定的起点时间开始所经过的总秒数,通常用于表示某个时刻。它是计算机中一种常见的时间表示方式,可以精确、方便地进行时间计算和排序。
-
Unix时间戳(Unix Timestamp):是自1970年1月1日 00:00:00 UTC以来所经过的总秒数。
-
它是一个整数(精确到秒),例如:
1715601130
表示的是 2025年5月13日 13:32:10(UTC) 左右。
时间戳的特点
特性 | 描述 |
---|---|
精度高 | 精确到秒(也可毫秒、微秒) |
易于比较 | 时间戳是整数,直接比较大小即可判断前后 |
跨平台通用 | 适用于大多数编程语言和数据库 |
不含时区信息 | 默认以UTC计算,需要转换为本地时间 |
UNIX_TIMESTAMP()
-
功能:获取当前时间的 Unix 时间戳(单位:秒)
-
示例:
SELECT UNIX_TIMESTAMP();
-- 返回:1715601130
FROM_UNIXTIME(timestamp)
-
功能:将 Unix 时间戳转为可读的日期时间
-
示例:
SELECT FROM_UNIXTIME(1715601130);
-- 返回:2025-05-13 13:32:10
UNIX_TIMESTAMP(date)
-
功能:将一个标准时间转为 Unix 时间戳
-
示例:
SELECT UNIX_TIMESTAMP('2025-05-13 13:32:10');
-- 返回:1715601130
函数之间的联系
可以把它们看成一个工具链:
[当前时间] [日期格式化]
NOW() CURDATE() ───> DATE_FORMAT()
↓ ↑
DATE_ADD() TIMESTAMPDIFF()
DATE_SUB() DATEDIFF()
↓ ↑
生成目标时间 计算时间差
↓ ↑
YEAR(), MONTH(), DAY() ←────提取某部分
示例:
-- 查询本月注册的用户
SELECT * FROM users
WHERE DATE_FORMAT(created_at, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m');
-- 计算某订单创建以来已过天数
SELECT DATEDIFF(NOW(), order_created_at) AS days_elapsed
FROM orders;
-- 添加30天后的到期时间
SELECT DATE_ADD(created_at, INTERVAL 30 DAY) AS expiry_date
FROM users;