优先用CURRENT_TIMESTAMP作默认值,NOW()用于显式赋值;MySQL中二者等效但CURRENT_TIMESTAMP支持列默认和自动更新,NOW()更稳妥;PostgreSQL必须用NOW()或CURRENT_TIMESTAMP(无括号);SQL Server推荐GETDATE()。

MySQL里用NOW()还是CURRENT_TIMESTAMP?
两者在大多数场景下效果一致,但语义和默认行为有区别:NOW()是函数调用,每次执行都取当前时间;CURRENT_TIMESTAMP可作函数也可作列默认值。如果字段定义为TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,那手动UPDATE时没显式赋值,它会自动更新——但如果你明确写了SET updated_at = CURRENT_TIMESTAMP,那就按你写的来。
实操建议:
- 想让某次更新强制设为当前时间,直接写
SET created_at = NOW()或SET created_at = CURRENT_TIMESTAMP都行 - 避免混用:不要在同一个
UPDATE语句里对同一字段既用NOW()又依赖ON UPDATE触发,逻辑容易失控 -
CURRENT_TIMESTAMP在严格模式下可能报错,而NOW()更稳妥
PostgreSQL必须用NOW(),不能写CURRENT_TIMESTAMP()带括号
PostgreSQL里CURRENT_TIMESTAMP本身就是一个常量表达式(不带括号),加括号会报错:ERROR: function current_timestamp() does not exist。而NOW()是函数,带括号才合法。
常见错误现象:
- 写成
UPDATE orders SET updated_at = CURRENT_TIMESTAMP();→ 报错 - 写成
UPDATE orders SET updated_at = NOW;(漏括号)→ 不报错但存的是函数指针,不是时间值 - 正确写法只有两种:
NOW()或CURRENT_TIMESTAMP(无括号)
SQL Server里别用GETDATE()以外的函数做日常更新
GETDATE()返回datetime,兼容性最好;SYSDATETIME()精度高但类型是datetime2,如果字段是datetime类型,强行赋值可能截断毫秒或报错。
使用场景注意点:
- 字段类型是
datetime→ 用GETDATE() - 字段是
datetime2→ 可用SYSDATETIME()或GETDATE(),后者会隐式转换,但丢失微秒精度 - 别用
GETUTCDATE()除非你真需要UTC时间——时区一错,日志就全偏了
WHERE条件里误判时间字段导致更新失效
很多人写UPDATE logs SET updated_at = NOW() WHERE updated_at ,结果一行没更新。问题往往出在:字段是<code>TIMESTAMP且带时区,而字符串字面量没指定时区,MySQL会按系统时区解析,PostgreSQL则按UTC处理。
安全做法:
- 用
CAST或CONVERT显式声明时区,比如 PostgreSQL:WHERE updated_at - 用函数比字符串更可靠,例如:
WHERE DATE(updated_at) (但注意索引失效) - 先
SELECT验证WHERE条件是否真能命中数据,再跑UPDATE
日期字段更新看着简单,但跨数据库、跨时区、跨类型时,一个符号或括号就能让整条语句静默失败。

















