在数据库查询的实际业务中,经常需要处理日期相加的需求,比如计算用户会员到期时间、统计未来7天的订单量、推算活动结束日期等,不同数据库系统的日期相加语法存在明显区别,需要针对性编写对应的SQL语句。

MySQL日期相加的SQL写法
MySQL提供了DATE_ADD函数来实现日期相加功能,该函数接收三个参数,分别是原始日期、时间间隔单位和间隔数值。
基础语法格式如下:
-- DATE_ADD函数语法 DATE_ADD(date, INTERVAL expr unit) -- date:原始日期,可以是日期类型的字段或者日期字符串 -- expr:间隔的数值,支持正数和负数,正数表示日期向后加,负数表示日期向前减 -- unit:时间间隔单位,常见的有DAY、MONTH、YEAR、HOUR、MINUTE、SECOND等
具体使用示例:
-- 当前日期加7天
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS future_date;
-- 指定日期加3个月
SELECT DATE_ADD('2024-03-15', INTERVAL 3 MONTH) AS new_date;
-- 订单表查询到期时间,下单时间加30天为到期时间
SELECT order_id, order_time, DATE_ADD(order_time, INTERVAL 30 DAY) AS expire_time FROM order_table;
PostgreSQL日期相加的SQL写法
PostgreSQL不需要使用特定的日期相加函数,直接通过日期加上间隔值的方式即可实现,语法更简洁直观。
基础语法格式如下:
-- 日期加间隔语法 date + INTERVAL 'expr unit'
具体使用示例:
-- 当前日期加7天 SELECT CURRENT_DATE + INTERVAL '7 DAY' AS future_date; -- 指定日期加2小时 SELECT '2024-03-15 10:30:00'::timestamp + INTERVAL '2 HOUR' AS new_time; -- 用户表查询会员到期时间,注册时间加1年为到期时间 SELECT user_id, register_time, register_time + INTERVAL '1 YEAR' AS vip_expire_time FROM user_table;
SQL Server日期相加的SQL写法
SQL Server使用DATEADD函数实现日期相加,参数顺序和MySQL的DATE_ADD略有不同。
基础语法格式如下:
-- DATEADD函数语法 DATEADD(unit, expr, date) -- unit:时间间隔单位,如day、month、year等,不需要加引号 -- expr:间隔的数值 -- date:原始日期
具体使用示例:
-- 当前日期加7天 SELECT DATEADD(day, 7, GETDATE()) AS future_date; -- 指定日期加6个月 SELECT DATEADD(month, 6, '2024-03-15') AS new_date; -- 活动表查询活动结束时间,开始时间加15天为结束时间 SELECT activity_id, start_time, DATEADD(day, 15, start_time) AS end_time FROM activity_table;
日期相加的注意事项
- 不同数据库的时间间隔单位写法有差异,比如MySQL的DAY在SQL Server中写法是day,编写时需要对应数据库的规则调整。
- 日期相加时如果原始日期是字符串类型,需要确保字符串格式符合数据库的日期格式要求,否则会出现转换错误。
- 如果相加后的日期超出该月份的最大天数,数据库会自动进行进位处理,比如1月31日加1个月会得到2月28日或者29日,具体根据当年闰年情况判断。
- 负数间隔可以实现日期相减的效果,不需要额外使用日期相减的函数。
常见场景示例
查询未来7天内即将过期的订单:
-- MySQL写法 SELECT order_id, order_time, DATE_ADD(order_time, INTERVAL 30 DAY) AS expire_time FROM order_table WHERE DATE_ADD(order_time, INTERVAL 30 DAY) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY); -- PostgreSQL写法 SELECT order_id, order_time, order_time + INTERVAL '30 DAY' AS expire_time FROM order_table WHERE order_time + INTERVAL '30 DAY' BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL '7 DAY';