好的!下面是 MySQL 中 DATE_SUB() 函数的详细讲解,包括语法、参数、用法示例和注意事项。


DATE_SUB() 函数详解

DATE_SUB() 用于从指定的日期中减去一个时间间隔,返回新的日期或日期时间值。


1. 函数语法

DATE_SUB(date, INTERVAL expr unit)
  • date:要操作的日期或日期时间表达式,可以是 DATEDATETIME 或 TIMESTAMP 类型。
  • expr:整数表达式,表示要减去的时间数量。
  • unit:时间单位,指定 expr 表示的时间类型。

2. 支持的时间单位(unit)

单位名说明示例表达式
MICROSECOND微秒INTERVAL 100 MICROSECOND
SECONDINTERVAL 30 SECOND
MINUTE分钟INTERVAL 5 MINUTE
HOUR小时INTERVAL 2 HOUR
DAYINTERVAL 10 DAY
WEEK星期(7 天)INTERVAL 3 WEEK
MONTHINTERVAL 1 MONTH
QUARTER季度(3 个月)INTERVAL 1 QUARTER
YEARINTERVAL 1 YEAR
SECOND_MICROSECOND秒 + 微秒INTERVAL '10:500' SECOND_MICROSECOND
MINUTE_MICROSECOND分 + 微秒INTERVAL '10:500' MINUTE_MICROSECOND
MINUTE_SECOND分 + 秒INTERVAL '10:30' MINUTE_SECOND
HOUR_MICROSECOND时 + 微秒INTERVAL '10:500' HOUR_MICROSECOND
HOUR_SECOND时 + 秒INTERVAL '10:30' HOUR_SECOND
HOUR_MINUTE时 + 分INTERVAL '10:30' HOUR_MINUTE
DAY_MICROSECOND天 + 微秒INTERVAL '10 10:500' DAY_MICROSECOND
DAY_SECOND天 + 秒INTERVAL '10 10:30' DAY_SECOND
DAY_MINUTE天 + 分INTERVAL '10 10:30' DAY_MINUTE
DAY_HOUR天 + 小时INTERVAL '10 10' DAY_HOUR

3. 详细示例

-- 从当前日期减去10天
SELECT DATE_SUB(CURDATE(), INTERVAL 10 DAY);

-- 从当前时间减去5小时
SELECT DATE_SUB(NOW(), INTERVAL 5 HOUR);

-- 减去2个月
SELECT DATE_SUB('2023-08-06', INTERVAL 2 MONTH);

-- 减去1年3个月
SELECT DATE_SUB('2023-08-06', INTERVAL 15 MONTH);

-- 结合时间减去1天5小时30分钟
SELECT DATE_SUB('2023-08-06 12:00:00', INTERVAL '1 05:30' DAY_HOUR);

-- 减去90秒
SELECT DATE_SUB('2023-08-06 12:00:00', INTERVAL 90 SECOND);

4. 与 DATE_ADD() 对比

  • DATE_ADD() 是加时间间隔,DATE_SUB() 是减时间间隔
  • 语法完全相同,区别只在于加或减
SELECT DATE_ADD('2023-08-06', INTERVAL 1 DAY);
SELECT DATE_SUB('2023-08-06', INTERVAL 1 DAY);

5. 注意事项

  • expr 必须是整数或符合时间格式的字符串
  • 如果日期参数是字符串,MySQL 会自动尝试解析
  • 如果结果日期超出范围,会返回 NULL
  • 对 DATETIME 类型,时间单位可以包含时分秒

6. 简单演示

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2025-08-06 09:00:00 |
+---------------------+

mysql> SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
+---------------------------+
| DATE_SUB(NOW(), INTERVAL 1 DAY) |
+---------------------------+
| 2025-08-05 09:00:00       |
+---------------------------+

如果你需要,我可以帮你写一个包含多种用法的 SQL 脚本,或者帮你写 DATE_SUB 的等效函数示例,或者给你做个时间计算的可视化小工具。你需要吗?