在SQL的实际使用中,日期的加减操作是非常高频的需求,无论是计算会员有效期、统计时间范围内的数据,还是生成时间序列,都需要用到对应的日期函数。不同数据库厂商提供的日期处理函数语法有所区别,下面分别介绍主流数据库的实现方式。

SQL Server 中的日期加减
SQL Server 提供了 DATEADD 函数来实现日期的加减,该函数可以指定要加减的时间单位,比如年、月、日、小时等。
DATEADD 函数的语法格式为:
DATEADD(datepart, number, date)
参数说明:
- datepart:指定要加减的时间单位,比如 year 表示年,month 表示月,day 表示日,hour 表示小时等。
- number:要加减的数值,正数表示加,负数表示减。
- date:原始的日期时间值。
下面是具体的使用示例:
-- 当前日期加3天 SELECT DATEADD(day, 3, GETDATE()) AS add_three_days; -- 指定日期减1个月 SELECT DATEADD(month, -1, '2024-05-20') AS sub_one_month; -- 日期加2小时 SELECT DATEADD(hour, 2, '2024-05-20 10:30:00') AS add_two_hours;
MySQL 中的日期加减
MySQL 提供了多个函数支持日期加减,常用的有 DATE_ADD、DATE_SUB 以及直接使用加减运算符的方式。
使用 DATE_ADD 和 DATE_SUB 函数
DATE_ADD 用于日期加操作,DATE_SUB 用于日期减操作,语法格式类似:
DATE_ADD(date, INTERVAL expr unit) DATE_SUB(date, INTERVAL expr unit)
参数说明:
- date:原始日期时间值。
- expr:要加减的数值。
- unit:时间单位,比如 DAY、MONTH、YEAR、HOUR 等。
使用示例:
-- 当前日期加7天
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS add_seven_days;
-- 指定日期减2年
SELECT DATE_SUB('2024-05-20', INTERVAL 2 YEAR) AS sub_two_years;
-- 日期加30分钟
SELECT DATE_ADD('2024-05-20 14:00:00', INTERVAL 30 MINUTE) AS add_thirty_minutes;
使用加减运算符
MySQL 还支持直接用 + 或 - 运算符对日期进行加减,语法更简洁:
-- 日期加10天 SELECT '2024-05-20' + INTERVAL 10 DAY AS add_ten_days; -- 日期减5小时 SELECT '2024-05-20 18:00:00' - INTERVAL 5 HOUR AS sub_five_hours;
PostgreSQL 中的日期加减
PostgreSQL 的日期加减操作相对灵活,支持直接使用运算符,也支持 INTERVAL 类型的时间间隔计算。
直接使用加减运算符的示例:
-- 当前日期加15天 SELECT CURRENT_DATE + INTERVAL '15 days' AS add_fifteen_days; -- 指定日期减3个月 SELECT '2024-05-20'::date - INTERVAL '3 months' AS sub_three_months; -- 时间加1小时20分钟 SELECT '2024-05-20 09:00:00'::timestamp + INTERVAL '1 hour 20 minutes' AS add_time;
也可以使用 DATE_TRUNC 配合加减操作处理更复杂的日期计算,比如获取当前月的第一天:
SELECT DATE_TRUNC('month', CURRENT_DATE) AS first_day_of_month;
日期加减的注意事项
- 不同数据库的时间单位写法有差异,比如 SQL Server 用 day,MySQL 用 DAY,PostgreSQL 用 days,使用时需要对应数据库的要求填写。
- 进行月份加减时,如果原始日期是当月最后一天,比如 1月31日加1个月,不同数据库的处理逻辑可能不同,部分数据库会返回2月28日或29日,需要根据业务需求验证结果。
- 日期加减时如果超出合法日期范围,比如 2024-02-30 这种不存在的日期,函数会返回错误或 NULL,需要提前做好日期合法性校验。
实际开发中建议先在小范围数据测试日期加减的结果,确认符合业务预期后再应用到正式环境,避免出现时间计算错误导致的数据问题。