TIMESTAMPADD是MySQL特有函数,用于给时间值添加指定单位的偏移量,语法为TIMESTAMPADD(unit, value, datetime_expr),unit必须为关键字(如DAY、MONTH),自动处理月末/闰年等日历逻辑,返回有效日期。
TIMESTAMPADD函数怎么用?TIMESTAMPADD是MySQL特有函数,不能直接在PostgreSQL、SQL Server或SQLite里用。它用来给一个时间值加上指定单位的偏移量,返回新的时间戳。注意:它的单位参数必须是关键字(如DAY、HOUR),不能是字符串或变量;而且第一个参数是单位,第二个是数值,第三个才是基准时间——顺序容易写反。
常见写法示例:
SELECT TIMESTAMPADD(DAY, 7, '2024-03-15');
结果是2024-03-22。如果想加3个月,写成TIMESTAMPADD(MONTH, 3, NOW())即可。
TIMESTAMPADD加月份有时结果出人意料?因为MONTH单位会按日历逻辑进位,不是简单加30天。比如TIMESTAMPADD(MONTH, 1, '2024-01-31')结果是2024-02-29(闰年),而TIMESTAMPADD(MONTH, 1, '2024-03-31')会变成2024-04-30——MySQL自动“截断”到当月最后一天,不会报错也不会溢出。
DATE_ADD(NOW(), INTERVAL 30 DAY)
TIMESTAMPADD(YEAR, 1, '2023-02-29')会返回NULL(因为2024-02-29合法,但2025-02-29不存在)DATE_ADD比,TIMESTAMPADD有什么实际差异?功能几乎重叠,但语法结构不同:DATE_ADD把单位和数值合并成INTERVAL表达式,更直观;TIMESTAMPADD把单位单独作为第一个参数,适合动态拼接SQL(比如单位来自配置表字段)。
这两个语句等价:
SELECT DATE_ADD('2024-01-01', INTERVAL 5 WEEK);
SELECT TIMESTAMPADD(WEEK, 5, '2024-01-01');
但要注意:DATE_ADD支持WEEK、QUARTER等单位,TIMESTAMPADD也支持,不过部分旧版本MySQL对QUARTER处理不一致;生产环境建议统一用DATE_ADD,除非明确需要参数化单位。
这个错误只说明当前数据库不是MySQL(或MariaDB),而是PostgreSQL、SQL Server、Oracle等。它们没有TIMESTAMPADD函数:
current_timestamp + INTERVAL '7 days'
DATEADD(day, 7, GETDATE())
SYSDATE + 7(天)或ADD_MONTHS(SYSDATE, 3)
跨数据库迁移SQL时,别只替换函数名,得整体重写时间计算逻辑——单位语义、月末处理、时区行为都可能不同。
真正麻烦的不是语法,而是不同数据库对“加一个月”这件事的理解差异。哪怕同是MySQL,5.6和8.0在边界日期上的表现也可能微调。上线前务必用真实业务日期做验证,尤其涉及月末、闰年、夏令时切换点。