好的!下面帮你详细介绍 MySQL 中的 TIMESTAMPDIFF() 函数,包括作用、语法、参数和示例。


MySQL TIMESTAMPDIFF() 函数简介

TIMESTAMPDIFF() 用于计算两个日期或时间表达式之间的差值,结果以指定的时间单位返回。


1. 语法

TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
  • unit:时间单位,表示结果的单位。常用的有:
单位说明
MICROSECOND微秒
SECOND
MINUTE分钟
HOUR小时
DAY
WEEK
MONTH
QUARTER季度
YEAR
  • datetime_expr1:开始时间(较小时间点)
  • datetime_expr2:结束时间(较大时间点)

2. 返回值

  • 返回 datetime_expr2 - datetime_expr1 之间的差值,以 unit 指定的单位表示。
  • 结果是整数,表示完整的单位数(向下取整)。
  • 如果 datetime_expr2 < datetime_expr1,结果为负值。

3. 示例

假设有如下日期:

SELECT '2023-01-01 00:00:00' AS start_time, '2023-02-15 12:30:00' AS end_time;

计算两个时间差的例子

SELECT
  TIMESTAMPDIFF(YEAR, '2023-01-01', '2025-12-31') AS years_diff,
  TIMESTAMPDIFF(MONTH, '2023-01-01', '2023-12-31') AS months_diff,
  TIMESTAMPDIFF(DAY, '2023-01-01', '2023-01-31') AS days_diff,
  TIMESTAMPDIFF(HOUR, '2023-01-01 12:00:00', '2023-01-02 14:00:00') AS hours_diff,
  TIMESTAMPDIFF(MINUTE, '2023-01-01 12:00:00', '2023-01-01 13:30:00') AS minutes_diff,
  TIMESTAMPDIFF(SECOND, '2023-01-01 12:00:00', '2023-01-01 12:00:30') AS seconds_diff;

结果:

years_diffmonths_diffdays_diffhours_diffminutes_diffseconds_diff
21130269030

负值示例

SELECT TIMESTAMPDIFF(DAY, '2023-01-10', '2023-01-01') AS diff;

结果:

diff
-9

4. 实际应用场景

  • 计算用户注册到现在的天数
  • 计算订单下单到发货的时间差(小时、分钟)
  • 统计某活动持续的月数或年数
  • 计算两个日期间的月份差异,方便分组统计

好的!我帮你写几个结合实际表结构的 TIMESTAMPDIFF() 实战 SQL 示例,并简单对比一下与 DATEDIFF()TIMEDIFF() 的区别。


一、实战 SQL 示例

假设有张订单表 orders,结构如下:

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  user_id INT,
  order_date DATETIME,
  ship_date DATETIME,
  delivery_date DATETIME
);

1. 计算订单从下单到发货的时长(小时)

SELECT
  order_id,
  TIMESTAMPDIFF(HOUR, order_date, ship_date) AS hours_to_ship
FROM orders
WHERE ship_date IS NOT NULL;

2. 查询用户注册后到今天的天数(假设有用户表 users

SELECT
  user_id,
  TIMESTAMPDIFF(DAY, registration_date, NOW()) AS days_since_registration
FROM users;

3. 统计每个订单的发货到送达时间(分钟)

SELECT
  order_id,
  TIMESTAMPDIFF(MINUTE, ship_date, delivery_date) AS delivery_time_minutes
FROM orders
WHERE delivery_date IS NOT NULL;

4. 按月份统计本年度每个月订单数量

SELECT
  MONTH(order_date) AS month,
  COUNT(*) AS order_count
FROM orders
WHERE YEAR(order_date) = YEAR(CURDATE())
GROUP BY month
ORDER BY month;

如果想计算每个订单距离当月初有多少天差距:

SELECT
  order_id,
  TIMESTAMPDIFF(DAY, DATE_FORMAT(order_date, '%Y-%m-01'), order_date) AS days_from_month_start
FROM orders;

二、与其它时间函数对比

函数作用返回类型单位示例
TIMESTAMPDIFF()两个时间点间差值,指定单位整数YEAR, MONTH, DAY, HOUR…TIMESTAMPDIFF(DAY, '2023-01-01', '2023-01-10') 返回 9
DATEDIFF()计算两个日期相差的天数(只考虑日期部分)整数DATEDIFF('2023-01-10', '2023-01-01') 返回 9
TIMEDIFF()计算两个时间点间的时间差(返回时间类型)TIME 类型时:分:秒TIMEDIFF('12:00:00', '10:30:00')返回 01:30:00

重点区别:

  • TIMESTAMPDIFF() 更灵活,可以指定单位,比如秒、分、小时、天、月、年。
  • DATEDIFF() 只能返回两个日期之间的天数(不包含时间部分)。
  • TIMEDIFF() 返回的是时间差,格式为 HH:MM:SS,适合计算时间段长度。