mysql需用date_add()或now()+interval更新时间,避免整数加法错误;postgresql须用current_timestamp+interval且注意时区;sql server必须用dateadd()并严格参数顺序。

MySQL 中用 NOW() 和日期运算符更新时间
MySQL 不支持直接在 UPDATE 里写 date_field = date_field + 7 这种算术式(会报错或误转为数字加法)。必须用日期函数:DATE_ADD() 或简写 + 配合 INTERVAL。
常见错误是写成 SET updated_at = updated_at + 3,结果字段变成类似 20240501000000 + 3 的整数加法,数据全毁。
- 加 5 天:
SET updated_at = DATE_ADD(NOW(), INTERVAL 5 DAY) - 减 3 小时:
SET updated_at = DATE_SUB(NOW(), INTERVAL 3 HOUR) - 更简洁写法(仅 MySQL):
SET updated_at = NOW() + INTERVAL -2 WEEK - 注意:如果字段是
DATETIME,NOW()没问题;如果是DATE,建议用CURDATE()避免时分秒干扰
PostgreSQL 中用 CURRENT_TIMESTAMP 和 INTERVAL
PostgreSQL 对时间运算更严格,不能直接对 timestamp 加整数,必须显式用 INTERVAL。而且 CURRENT_TIMESTAMP 返回带时区的 timestamptz,若字段是 timestamp without time zone,可能触发隐式转换警告。
- 加 10 天:
SET updated_at = CURRENT_TIMESTAMP + INTERVAL '10 days' - 减 1 个月(注意:不是固定天数,会按日历计算):
SET updated_at = CURRENT_TIMESTAMP - INTERVAL '1 month' - 安全写法(避免时区扰动):
SET updated_at = LOCALTIMESTAMP + INTERVAL '7 hours' - 字符串形式的 interval 必须加单引号,单位小写(
'3 weeks'),空格不能省
SQL Server 中用 DATEADD() 函数
SQL Server 不支持 + 直接加减日期字面量,必须用 DATEADD(),且第一个参数是日期部分(如 day、month),第二个是数值,第三个才是基准时间——顺序容易记反。
- 加 14 天:
SET updated_at = DATEADD(day, 14, GETDATE()) - 减 2 年:
SET updated_at = DATEADD(year, -2, GETDATE()) - 别写成
DATEADD(14, day, GETDATE())—— 参数顺序错会导致语法错误 -
GETDATE()返回本地时区,SYSDATETIMEOFFSET()才带时区信息,按需选择
跨数据库兼容写法与坑点提醒
没有真正“通用”的写法,但可以规避几个高频翻车点:一是把日期字段当字符串拼接(比如 '2024-01-01' + '7'),二是忽略字段精度导致截断(如 DATETIME 字段存 TIMESTAMP WITH TIME ZONE 值),三是误用 SYSDATE(Oracle)或 CURRENT_DATE(只含日期无时间)去更新需要完整时间戳的字段。
- 更新前先查字段类型:
DESCRIBE table_name(MySQL)或\d table_name(psql) - 批量更新前务必加
WHERE条件,否则整表时间全被刷掉 - 涉及业务有效期逻辑(如“7天后过期”),别用
NOW() + INTERVAL 7 DAY算完再存,而应在查询时实时计算,避免时间漂移 - 测试时用
SELECT先验证表达式结果,例如:SELECT NOW() + INTERVAL 1 DAY











