在 MySQL 中计算两个日期之间的天数,核心是利用 日期函数 直接对 DATE
/DATETIME
类型的字段或值进行运算,无需手动转换格式。以下是最常用的 3 种方法,覆盖不同场景需求:
DATEDIFF()
是 MySQL 专门用于计算 “两个日期相差天数” 的函数,语法简洁、效率高,仅返回天数差(忽略时间部分)。
-
返回结果:整数,
结束日期 - 开始日期
的差值(正数表示结束日期在后面,负数表示结束日期在前面,0 表示同一天)。
-
特点:自动忽略
DATETIME
类型的时间部分(如 2024-05-10 23:59:59
和 2024-05-09 00:00:00
会被当作 2024-05-10
和 2024-05-09
计算)。
SELECT DATEDIFF('2024-05-15', '2024-05-01') AS 天数差;
假设有 order
表,包含 create_time
(订单创建日期,DATETIME
类型)和 pay_time
(支付日期,DATETIME
类型),需计算 “从创建到支付的天数差”:
SELECT
order_id,
create_time,
pay_time,
DATEDIFF(pay_time, create_time) AS 支付耗时天数
FROM
`order`;
结果示例:
TIMESTAMPDIFF()
比 DATEDIFF()
更灵活,可计算 “年、月、日、时、分、秒” 等多种时间单位的差值,适合需要精确控制计算维度的场景。
TIMESTAMPDIFF(时间单位, 开始日期, 结束日期)
-
时间单位:必须指定,常用值包括
DAY
(天)、HOUR
(小时)、MINUTE
(分钟)、SECOND
(秒)、MONTH
(月)、YEAR
(年)。
-
返回结果:整数,
结束日期 - 开始日期
在指定单位下的差值(同样支持正负)。
-
特点:会根据时间单位处理时间部分(如计算 “天” 时,不足 1 天的部分会被舍去,如
2024-05-10 23:00:00
到 2024-05-11 01:00:00
按 DAY
计算为 0)。
SELECT TIMESTAMPDIFF(DAY, '2024-05-10 23:00:00', '2024-05-11 01:00:00') AS 天数差;
SELECT
order_id,
create_time,
pay_time,
TIMESTAMPDIFF(HOUR, create_time, pay_time) AS 支付耗时小时
FROM
`order`;
结果示例:
MySQL 支持对 DATE
/DATETIME
类型的值直接做减法运算,返回的结果是 “天数差 + 小数部分(时间占比)”,需手动处理才能得到整数天数。
SELECT '2024-05-15' - '2024-05-01' AS 直接相减结果;
SELECT '2024-05-11 01:00:00' - '2024-05-10 23:00:00' AS 直接相减结果;
SELECT FLOOR('2024-05-11 01:00:00' - '2024-05-10 23:00:00') AS 天数差;
-
结果包含小数部分,需额外处理才能得到纯天数;
-
可读性差,不如
DATEDIFF
/TIMESTAMPDIFF
直观,不推荐在实际开发中使用。
若日期字段可能为 NULL
(如未支付的订单,pay_time
为 NULL
),直接计算会返回 NULL
,需用 IFNULL()
填充默认值(如当前日期):
SELECT
order_id,
create_time,
pay_time,
DATEDIFF(IFNULL(pay_time, CURDATE()), create_time) AS 耗时天数
FROM
`order`;
需计算 “某个日期到当前日期的天数差”,用 CURDATE()
(当前日期,无时间)或 NOW()
(当前日期时间)作为 “结束日期”:
SELECT
user_id,
register_time,
DATEDIFF(CURDATE(), register_time) AS 注册天数
FROM
user;
推荐优先使用 DATEDIFF
(仅需天数)或 TIMESTAMPDIFF
(需多单位),避免直接相减。