mysql中查当前时间最稳妥用now()或current_timestamp(),二者等价且返回语句执行时刻的服务器本地时间;避免sysdate()因多次调用结果不一致,注意时区影响及utc_timestamp()的使用场景。

直接用 NOW() 或 CURRENT_TIMESTAMP()
MySQL 里查当前时间最常用、最稳妥的方式就是调用内置函数。这两个函数完全等价,返回的是执行语句那一刻的服务器本地时间(精确到秒或微秒,取决于 MySQL 版本和字段精度)。别用 SYS_DATE() 或 GETDATE() —— 它们不是 MySQL 的函数,会报错。
-
NOW()是最简写法,语义清晰,推荐日常使用 -
CURRENT_TIMESTAMP()是 SQL 标准写法,兼容性略好,但实际效果一样 - 如果需要微秒级精度,写成
NOW(6)或CURRENT_TIMESTAMP(6),括号里的数字表示小数位数(0–6) - 注意:返回值类型是
DATETIME,不是字符串;如需转字符串,得显式用DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')
为什么不能用 SYSDATE()?
SYSDATE() 看起来像“系统时间”,但它行为特殊:在一条语句中多次调用时,每次都会重新求值(比如在 UPDATE 里给多行赋值),而 NOW() 在整条语句开始时就固定了时间戳。多数场景下你想要的是“语句开始时刻”的一致时间,所以 SYSDATE() 容易引发意料外的时间不一致问题。
- 例如:
UPDATE t SET a = NOW(), b = NOW()→ a 和 b 值相同 - 而:
UPDATE t SET a = SYSDATE(), b = SYSDATE()→ a 和 b 可能差几毫秒(尤其在慢查询或高负载下) - 除非你明确需要“实时逐次取值”,否则一律避开
SYSDATE()
时区会影响结果吗?
会,而且影响很直接。MySQL 默认使用服务器系统时区(由 system_time_zone 变量决定),但每个连接可单独设置时区(通过 time_zone 变量)。这意味着同一时刻,不同连接看到的 NOW() 结果可能不同。
- 查当前会话时区:
SELECT @@time_zone - 临时切换(仅当前会话):
SET time_zone = '+08:00'或SET time_zone = 'Asia/Shanghai' - 生产环境务必确认
time_zone设置一致,否则日志时间、定时任务、跨库同步都可能出偏差 - UTC 时间更可靠?可用
UTC_TIMESTAMP(),它始终返回协调世界时,不受会话时区影响
在建表或默认值里怎么安全用?
建表时设默认时间戳,别直接写 DEFAULT NOW() —— 这在旧版本 MySQL(5.6 之前)不支持,且部分 ORM 或迁移工具解析不稳定。正确写法是:
CREATE TABLE events ( id INT PRIMARY KEY, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
-
DEFAULT CURRENT_TIMESTAMP是标准语法,MySQL 5.6+ 全面支持 -
ON UPDATE CURRENT_TIMESTAMP表示更新行时自动刷新该字段,不用手动写 UPDATE 语句 - 避免用函数作为列默认值的变体(比如
DEFAULT (NOW())),括号写法只在 MySQL 8.0.13+ 支持,兼容性差 - 如果字段类型是
TIMESTAMP,默认行为已隐含时区转换,而DATETIME不做转换——选哪个取决于你是否需要自动时区适配
真正容易被忽略的点是:时间函数返回值依赖于 MySQL 服务端配置,而不是客户端本地时间;哪怕你在东八区连上一个设在 UTC 的数据库,NOW() 显示的仍是服务器那边的“现在”。查时间前,先确认 SELECT @@global.time_zone, @@session.time_zone。











