DATEADD仅SQL Server及Azure SQL原生支持,MySQL/PostgreSQL等需改用INTERVAL运算;其语法为DATEADD(datepart,number,date),参数顺序固定且datepart不加s;跨库移植须注意时区、单位大小写及季度等非标写法差异。

DATEADD 不是标准 SQL 函数,它只在 SQL Server、Azure SQL 和某些兼容版本中原生支持;MySQL、PostgreSQL、SQLite 都不认这个函数——直接写会报 Invalid column name 'DATEADD' 或类似错误。
SQL Server 中 DATEADD 的正确用法和参数顺序
它的调用格式固定为:DATEADD(datepart, number, date),三者缺一不可,且顺序不能颠倒。其中:
-
datepart必须是预定义关键字,比如day、month、year、hour、minute(注意:不加s,写成days会报错) -
number是整数,正数表示未来,负数表示过去 -
date可以是列名、字符串字面量(如'2024-01-01')或函数如GETDATE()
例如:获取当前时间 3 天后:SELECT DATEADD(day, 3, GETDATE());获取上个月第一天:SELECT DATEADD(month, -1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1))。
MySQL / PostgreSQL 用户别硬套 DATEADD,改用标准日期运算
MySQL 支持直接用 + 和 - 操作日期,配合 INTERVAL 关键字更安全:
- 3 天后:
SELECT NOW() + INTERVAL 3 DAY - 2 小时前:
SELECT NOW() - INTERVAL 2 HOUR - 注意:单位必须大写(
DAY、HOUR),小写会报错;INTERVAL 1.5 DAY不合法,只接受整数间隔
PostgreSQL 更灵活,支持 INTERVAL '3 days' 字符串语法,也支持 NOW() + '3 days'::interval,但推荐显式写 ::interval 避免隐式转换歧义。
跨数据库移植时 DATEADD 最容易踩的坑
很多团队把 SQL Server 脚本直接扔进 MySQL 环境跑,结果全挂——不是语法错,就是逻辑错。典型陷阱有:
- 误以为
DATEADD(week, 1, GETDATE())在 MySQL 也能用 → 实际要写NOW() + INTERVAL 7 DAY - 在 PostgreSQL 里照抄
DATEADD(qq, 1, GETDATE())(SQL Server 的季度简写)→ PostgreSQL 没qq,得用NOW() + INTERVAL '3 months' - 忽略时区:SQL Server 默认用服务器时区,而 MySQL 的
NOW()依赖time_zone系统变量,可能返回 UTC 时间
如果项目需要多数据库兼容,建议封装日期计算逻辑到应用层,或统一用 ANSI 标准的 CURRENT_DATE + 显式算术(如 CURRENT_DATE + 3 在多数引擎中可工作,但仅限天级精度)。
真正麻烦的从来不是“怎么加三天”,而是“加完之后要不要截断时间部分”“跨月时最后一天怎么处理”“夏令时切换会不会跳小时”——这些细节,DATEADD 和 INTERVAL 都不会替你判断。

















