<p>date_add和date_sub是sql中用于日期增减的核心函数,语法为date_add(date, interval value unit)和date_sub(date, interval value unit),支持如day、month、year等单位;例如select date_add(curdate(), interval 1 day)计算明天日期;不同数据库兼容性不同:mysql直接支持,postgresql使用+/- interval运算符,sql server用dateadd(unit, value, date),oracle则用sysdate加减或add_months函数;常见陷阱包括隐式类型转换错误和月末日期处理异常,如date_add('2023-01-31', interval 1 month)返回2023-02-28而非2023-02-31;性能优化建议避免在where子句中对索引列使用函数,应改写为order_date < date_sub(curdate(), interval 7 day)以利用索引;此外sql还提供curdate、now、datediff、date_format、extract、last_day等函数,配合使用可实现完整的日期时间处理能力。</p>

SQL中,
DATE_ADD
DATE_SUB
在SQL中,
DATE_ADD
DATE_SUB
DATE_ADD(date, INTERVAL value unit)
DATE_SUB(date, INTERVAL value unit)
date
value
unit
DAY
MONTH
YEAR
HOUR
MINUTE
SECOND
举几个例子可能更直观:
假设我们想知道“明天”的日期:
SELECT DATE_ADD(CURDATE(), INTERVAL 1 DAY);
或者我想看看“上个月的今天”是什么时候:
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH);
如果你要处理更精确的时间,比如某个事件发生后两小时:
SELECT DATE_ADD('2023-10-26 10:00:00', INTERVAL 2 HOUR);甚至可以组合单位,比如增加1年2个月3天:
SELECT DATE_ADD('2023-01-01', INTERVAL '1 YEAR 2 MONTH 3 DAY');这玩意儿用起来其实非常灵活,基本上你想到什么时间单位,它都能支持。
说实话,虽然
DATE_ADD
DATE_SUB
在MySQL中,
DATE_ADD(date, INTERVAL value unit)
DATE_SUB(date, INTERVAL value unit)
但如果你去了PostgreSQL,它更倾向于使用运算符来做日期增减,比如:
SELECT CURRENT_DATE + INTERVAL '1 day';
SELECT NOW() - INTERVAL '2 hours';
DATE_ADD
DATE_SUB
到了SQL Server,它有自己的
DATEADD
DATEADD(unit, value, date)
SELECT DATEADD(day, 1, GETDATE());
SELECT DATEADD(month, -1, GETDATE());
而Oracle就更“个性”了,它没有直接对应的
DATE_ADD
DATE_SUB
SELECT SYSDATE + 1 FROM DUAL;
SELECT SYSDATE - 1/24 FROM DUAL;
ADD_MONTHS
SELECT ADD_MONTHS(SYSDATE, 1) FROM DUAL;
NUMTODSINTERVAL
NUMTOYMINTERVAL
SELECT SYSDATE + NUMTODSINTERVAL(2, 'HOUR') FROM DUAL;
所以,当你跨数据库平台时,代码迁移最容易出问题的地方之一就是日期时间函数。你得根据目标数据库的文档,做相应的调整。没有一套放之四海而皆准的
DATE_ADD
DATE_SUB
用这些日期函数,虽然方便,但也有坑,特别是涉及到性能和逻辑判断的时候。
一个常见的陷阱是隐式类型转换。如果你把一个字符串直接扔给
DATE_ADD
另一个大坑是月末效应。比如,
DATE_ADD('2023-01-31', INTERVAL 1 MONTH)2023-02-31
2023-02-28
2023-02-29
性能方面,在
WHERE
DATE_ADD
DATE_SUB
SELECT * FROM orders WHERE DATE_ADD(order_date, INTERVAL 7 DAY) < CURDATE();
order_date
DATE_ADD
order_date
优化策略其实很简单,就是把计算放在等号的另一边,让索引列保持“干净”:
SELECT * FROM orders WHERE order_date < DATE_SUB(CURDATE(), INTERVAL 7 DAY);
order_date
还有,对于大量的数据操作,如果可以提前计算好日期范围,或者在应用层处理部分日期逻辑,也能减轻数据库的负担。不要把所有复杂的日期计算都扔给SQL。
除了
DATE_ADD
DATE_SUB
最基础的,你肯定会用到获取当前日期和时间的函数:
CURDATE()
CURRENT_DATE()
CURTIME()
CURRENT_TIME()
NOW()
CURRENT_TIMESTAMP()
当你需要计算两个日期之间的时间差时,
DATEDIFF()
DATEDIFF(date1, date2)
DATEDIFF(unit, date1, date2)
日期格式化也是一个非常常用的需求,比如要把日期显示成“2023年10月26日”这种格式,就需要
DATE_FORMAT()
FORMAT()
SELECT DATE_FORMAT(CURDATE(), '%Y年%m月%d日');
如果你只想提取日期中的某个部分,比如年份、月份或小时,
EXTRACT()
YEAR()
MONTH()
DAY()
SELECT YEAR(CURDATE());
SELECT EXTRACT(MONTH FROM CURRENT_DATE);
有时候,你可能还需要判断某个日期是否是当月的最后一天,或者获取当月的最后一天。MySQL有
LAST_DAY()
SELECT LAST_DAY('2023-01-15');这些函数与
DATE_ADD
DATE_SUB
LAST_DAY()
DATE_ADD()
以上就是sql如何使用date_add和date_sub增减日期 sql日期增减与date_add用法的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号