mysql计算两个日期之间的天数,最常用的 3 种方法

时间:2025-09-15 16:16

在 MySQL 中计算两个日期之间的天数,核心是利用 日期函数 直接对 DATE/DATETIME 类型的字段或值进行运算,无需手动转换格式。以下是最常用的 3 种方法,覆盖不同场景需求:

一、核心方法:DATEDIFF() 函数(推荐)

DATEDIFF() 是 MySQL 专门用于计算 “两个日期相差天数” 的函数,语法简洁、效率高,仅返回天数差(忽略时间部分)。

1. 语法

sql
DATEDIFF(结束日期, 开始日期)
 

  • 返回结果:整数,结束日期 - 开始日期 的差值(正数表示结束日期在后面,负数表示结束日期在前面,0 表示同一天)。
  • 特点:自动忽略 DATETIME 类型的时间部分(如 2024-05-10 23:59:59 和 2024-05-09 00:00:00 会被当作 2024-05-10 和 2024-05-09 计算)。

2. 示例

示例 1:计算两个固定日期的天数差
sql
-- 计算 2024-05-15 与 2024-05-01 的天数差
SELECT DATEDIFF('2024-05-15', '2024-05-01') AS 天数差;
-- 结果:14(15-1=14)
 
示例 2:计算表中两个日期字段的天数差
假设有 order 表,包含 create_time(订单创建日期,DATETIME 类型)和 pay_time(支付日期,DATETIME 类型),需计算 “从创建到支付的天数差”:

sql
SELECT 
  order_id,
  create_time,
  pay_time,
  DATEDIFF(pay_time, create_time) AS 支付耗时天数  -- 支付日期 - 创建日期
FROM 
  `order`;  -- order 是关键字,用反引号包裹
 

结果示例

order_id create_time pay_time 支付耗时天数  
1001 2024-05-01 10:30:00 2024-05-01 14:15:00 0 (同一天,忽略时间)
1002 2024-05-02 09:00:00 2024-05-05 18:40:00 3 (5-2=3)
1003 2024-05-10 22:00:00 2024-05-08 10:00:00 -2 (支付日期在创建日期前,返回负数)

二、灵活方法:TIMESTAMPDIFF() 函数(支持多时间单位)

TIMESTAMPDIFF() 比 DATEDIFF() 更灵活,可计算 “年、月、日、时、分、秒” 等多种时间单位的差值,适合需要精确控制计算维度的场景。

1. 语法

sql
TIMESTAMPDIFF(时间单位, 开始日期, 结束日期)
 

  • 时间单位:必须指定,常用值包括 DAY(天)、HOUR(小时)、MINUTE(分钟)、SECOND(秒)、MONTH(月)、YEAR(年)。
  • 返回结果:整数,结束日期 - 开始日期 在指定单位下的差值(同样支持正负)。
  • 特点:会根据时间单位处理时间部分(如计算 “天” 时,不足 1 天的部分会被舍去,如 2024-05-10 23:00:00 到 2024-05-11 01:00:00 按 DAY 计算为 0)。

2. 示例

示例 1:按 “天” 计算(类似 DATEDIFF,但逻辑更严谨)
sql
-- 计算 2024-05-11 01:00:00 与 2024-05-10 23:00:00 的天数差
SELECT TIMESTAMPDIFF(DAY, '2024-05-10 23:00:00', '2024-05-11 01:00:00') AS 天数差;
-- 结果:0(不足 24 小时,按天计算舍去小数部分)
 
示例 2:按 “小时” 计算精确差值
sql
-- 计算订单创建到支付的小时差
SELECT 
  order_id,
  create_time,
  pay_time,
  TIMESTAMPDIFF(HOUR, create_time, pay_time) AS 支付耗时小时
FROM 
  `order`;
 

结果示例

order_id create_time pay_time 支付耗时小时  
1001 2024-05-01 10:30:00 2024-05-01 14:15:00 3 (14-10=4?实际差 3 小时 45 分,按小时舍去小数)
1002 2024-05-02 09:00:00 2024-05-05 18:40:00 81 (3 天 ×24 + 9 小时 40 分 → 81 小时)

三、基础方法:日期直接相减(不推荐)

MySQL 支持对 DATE/DATETIME 类型的值直接做减法运算,返回的结果是 “天数差 + 小数部分(时间占比)”,需手动处理才能得到整数天数。

1. 语法与示例

sql
-- 直接相减:返回值为“天数 + 时间占比”(1天=1,1小时=1/24)
SELECT '2024-05-15' - '2024-05-01' AS 直接相减结果;
-- 结果:14.000000(纯日期相减,无时间部分,结果为整数)

SELECT '2024-05-11 01:00:00' - '2024-05-10 23:00:00' AS 直接相减结果;
-- 结果:0.083333(2小时 / 24小时 = 1/12 ≈ 0.083333)

-- 如需整数天数,需用 FLOOR() 或 CAST() 取整
SELECT FLOOR('2024-05-11 01:00:00' - '2024-05-10 23:00:00') AS 天数差;
-- 结果:0
 

2. 缺点

  • 结果包含小数部分,需额外处理才能得到纯天数;
  • 可读性差,不如 DATEDIFF/TIMESTAMPDIFF 直观,不推荐在实际开发中使用

四、特殊场景处理

1. 处理 NULL 值

若日期字段可能为 NULL(如未支付的订单,pay_time 为 NULL),直接计算会返回 NULL,需用 IFNULL() 填充默认值(如当前日期):

sql
-- 未支付的订单,按“当前日期 - 创建日期”计算耗时(假设未支付)
SELECT 
  order_id,
  create_time,
  pay_time,
  DATEDIFF(IFNULL(pay_time, CURDATE()), create_time) AS 耗时天数
FROM 
  `order`;
-- CURDATE():返回当前日期(如 2024-05-15)
 

2. 计算 “距今” 的天数

需计算 “某个日期到当前日期的天数差”,用 CURDATE()(当前日期,无时间)或 NOW()(当前日期时间)作为 “结束日期”:

sql
-- 计算用户注册到今天的天数(用 CURDATE() 忽略时间)
SELECT 
  user_id,
  register_time,
  DATEDIFF(CURDATE(), register_time) AS 注册天数
FROM 
  user;
 

五、方法对比与选择

函数 优点 缺点 适用场景
DATEDIFF 语法简洁、仅算天数、忽略时间 仅支持天数,不支持其他时间单位 快速计算两个日期的天数差(如订单耗时)
TIMESTAMPDIFF 支持多时间单位(天 / 时 / 分 / 秒)、灵活 语法稍复杂,需指定时间单位 需精确控制时间单位(如按小时计算耗时)
直接相减 无需调用函数 结果含小数、可读性差、需额外处理 不推荐,仅了解即可

推荐优先使用 DATEDIFF(仅需天数)或 TIMESTAMPDIFF(需多单位),避免直接相减。
 

mysql删除重复数据只保留一条,选择适合你表结构的方法
闪客派对!FlashFXP 3.0 快乐通关秘籍
打造高信息密度WordPress主题:复刻知乎问答体验
Oracle数据库exp备份:幽默指南与教程
备份软件,让数据管理变得轻松愉快
逆袭学习法:如何启动你的垫底辣妹FTP
键盘一摔,老子要把“最近使用的文件”全扔进黑洞!
WordPress图片本地化存储策略
MySQL迁移至MSSQL的实践指南
北京石油化学院备份机房建设与发展