当前位置: 首页 > news >正文

MySQL 日期加减函数详解

MySQL 日期加减函数详解

1. DATE_ADD 函数

基本语法

DATE_ADD(date, INTERVAL expr unit)

功能

在指定日期/时间上添加一个时间间隔

参数说明

  • date:要处理的日期/时间值(可以是DATE, DATETIME或TIMESTAMP类型)
  • expr:要添加的间隔数值(可以是正数或负数)
  • unit:时间单位(见下方支持的单位)

支持的时间单位

MICROSECOND | SECOND | MINUTE | HOUR | DAY 
| WEEK | MONTH | QUARTER | YEAR 
| SECOND_MICROSECOND | MINUTE_MICROSECOND 
| MINUTE_SECOND | HOUR_MICROSECOND 
| HOUR_SECOND | HOUR_MINUTE 
| DAY_MICROSECOND | DAY_SECOND 
| DAY_MINUTE | DAY_HOUR 
| YEAR_MONTH

使用示例

-- 加1天
SELECT DATE_ADD('2023-01-01', INTERVAL 1 DAY);  -- 结果: 2023-01-02-- 加1个月
SELECT DATE_ADD('2023-01-31', INTERVAL 1 MONTH); -- 结果: 2023-02-28 (自动处理月末)-- 加1年
SELECT DATE_ADD('2020-02-29', INTERVAL 1 YEAR);  -- 结果: 2021-02-28 (闰年自动调整)-- 加3小时30分钟
SELECT DATE_ADD('2023-01-01 12:00:00', INTERVAL '3:30' HOUR_MINUTE); -- 结果: 2023-01-01 15:30:00-- 使用负数表示减法
SELECT DATE_ADD('2023-01-01', INTERVAL -1 DAY);  -- 结果: 2022-12-31

2. DATE_SUB 函数

基本语法

DATE_SUB(date, INTERVAL expr unit)

功能

与DATE_ADD相反,从指定日期/时间减去一个时间间隔

使用示例

-- 减1天
SELECT DATE_SUB('2023-01-01', INTERVAL 1 DAY);  -- 结果: 2022-12-31-- 减1个月
SELECT DATE_SUB('2023-03-31', INTERVAL 1 MONTH); -- 结果: 2023-02-28-- 等同于DATE_ADD使用负数
SELECT DATE_SUB('2023-01-01', INTERVAL 1 DAY) = DATE_ADD('2023-01-01', INTERVAL -1 DAY); -- 结果: 1(TRUE)

3. 简写语法

MySQL还提供更简洁的日期加减写法:

-- 加1天
SELECT '2023-01-01' + INTERVAL 1 DAY;-- 减1个月
SELECT '2023-01-01' - INTERVAL 1 MONTH;

4. 实际应用场景

场景1:计算到期日

-- 贷款30天后到期
SELECT loan_date, DATE_ADD(loan_date, INTERVAL 30 DAY) AS due_date 
FROM loans;

场景2:查找最近7天的记录

SELECT * FROM orders 
WHERE order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY);

场景3:处理订阅续期

-- 订阅续期1年
UPDATE subscriptions 
SET end_date = DATE_ADD(end_date, INTERVAL 1 YEAR)
WHERE user_id = 1001;

5. 注意事项

  1. 自动调整无效日期

    SELECT DATE_ADD('2023-01-31', INTERVAL 1 MONTH); -- 返回2023-02-28
    
  2. 闰年处理

    SELECT DATE_ADD('2020-02-29', INTERVAL 1 YEAR); -- 返回2021-02-28
    
  3. 时间溢出处理

    SELECT DATE_ADD('2023-01-01 23:59:59', INTERVAL 1 SECOND); -- 返回2023-01-02 00:00:00
    
  4. 性能考虑:在WHERE条件中对列使用这些函数会导致索引失效

6. 与其他日期函数的对比

需求推荐函数示例
计算未来/过去特定时间点DATE_ADD/DATE_SUBDATE_ADD(now(), INTERVAL 1 HOUR)
计算两个日期的差值DATEDIFF/TIMESTAMPDIFFDATEDIFF(end_date, start_date)
提取日期部分DATE_FORMAT/EXTRACTEXTRACT(YEAR FROM date)
获取当前日期/时间NOW/CURDATESELECT CURDATE(), NOW()

相关文章:

  • 进程间通信(IPC)
  • sql 注入中的万能密码
  • iOS启动优化:从原理到实践
  • ActiveMQ 集群搭建与高可用方案设计(二)
  • 大数据:数字时代的驱动力
  • 数据库原理与应用实验二 题目七
  • Oracle 11g通过dg4odbc配置dblink连接神通数据库
  • 前端面试每日三题 - Day 23
  • 多数据源动态切换
  • HTML简介
  • ​​信息泄露:网站敏感文件泄漏的隐形危机与防御之道​
  • 高性能架构设计-高可用
  • 专为焦油介质打造:煤焦油专用气动硬密封调节 V 型球阀(带手动)的卓越特点-耀圣
  • C#VisionMaster算子二次开发(非方案版)
  • 在Java项目中实现本地语音识别与热点检测,并集成阿里云智能语音服务
  • 考研408《计算机组成原理》复习笔记,第二章计算机性能
  • 第2章 创建独立的 Anaconda 环境
  • 基于机器学习的心脏病数据分析与可视化(百度智能云千帆AI+DeepSeek人工智能+机器学习)健康预测、风险评估与数据可视化 健康管理平台 数据分析与处理
  • 网格不迷路:用 CSS 网格生成器打造完美布局
  • 0902Redux_状态管理-react-仿低代码平台项目
  • 江苏淮安优化村级资源配置:淮安区多个空心村拟并入邻村
  • 湖北十堰市委副秘书长管聪履新丹江口市代市长
  • 国际上首次,地月空间卫星激光测距试验在白天成功实施
  • 微软通讯软件Skype正式停止运营:斥资85亿美元购入,月活用户曾超3亿
  • 特朗普要征100%关税,好莱坞这批境外摄制新片有麻烦了
  • 解放军仪仗司礼大队仪仗分队参加纪念苏联伟大卫国战争胜利80周年阅兵活动