在 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(需多单位),避免直接相减。