NOW 是什么
NOW() 取当前日期时间,是最常用的时间函数之一。行为上两库有细微差别:MySQL 的 NOW() 在语句开始执行时取值,同一条语句里多次调用结果相同;PostgreSQL 的 now() 等价于 transaction_timestamp(),返回事务开始时间,同一事务内多次调用保持一致。需要真正「每语句各自取时」的场景,MySQL 用 SYSDATE(),PostgreSQL 用 clock_timestamp()。写时间戳列时用数据库时间比应用服务器时间更可靠,也避免了机器时钟不一致的问题。
基本信息
| MySQL | NOW() 与 CURRENT_TIMESTAMP 等价,取语句开始时间 |
|---|---|
| PostgreSQL | now() 等于事务开始时间,事务内保持不变 |
| 每语句取时 | MySQL 用 SYSDATE();PostgreSQL 用 clock_timestamp() |
| 精度 | MySQL 用 NOW(3) 指定毫秒;PostgreSQL 默认微秒精度 |
| 时区 | MySQL 受 time_zone 设置影响,PostgreSQL 受会话时区影响 |
| 适用平台 | 两库都支持,语义略有差异 |
典型使用场景
- 写入创建时间:created_at 默认值用 CURRENT_TIMESTAMP
- 写入更新时间:UPDATE 时把 updated_at 设为 NOW()
- 时间窗口查询:配合区间条件查最近一小时的数据
- 计算耗时:与任务开始时间相减得到秒数
- 生成批次号:把日期时间拼进批次标识
- 审计记录:操作日志里记录发生时刻
示例
示例
-- MySQL
SELECT NOW(); # 语句开始时间
SELECT NOW(3); # 毫秒精度
INSERT INTO t (name, created_at) VALUES ('a', NOW());
-- PostgreSQL
SELECT now(); # 事务开始时间
SELECT clock_timestamp(); # 真实当前时刻
SELECT now() - INTERVAL '1 hour'; # 一小时前时间函数对照
| 用途 | MySQL | PostgreSQL |
|---|---|---|
| 当前时刻(语句级) | NOW() / CURRENT_TIMESTAMP | transaction_timestamp() |
| 当前时刻(真实) | SYSDATE() | clock_timestamp() |
| 当前日期 | CURDATE() | CURRENT_DATE |
| 当前时间 | CURTIME() | CURRENT_TIME |
| 精度控制 | NOW(3) | now() 默认为微秒 |
长事务里 now() 会一直返回事务开始时间,如果事务里要记录实际写入时刻,用 clock_timestamp() 或 SYSDATE() 更贴近现实。
服务端时间受时区设置影响:跨时区部署时统一用 UTC 存储、展示时再转换,能避免大量对不齐的问题。
用应用服务器时间写入业务表,多台机器时钟不同步会产生乱序时间线;时间戳字段优先由数据库生成。
时间戳字段的默认值优先交给数据库:建表时用 DEFAULT CURRENT_TIMESTAMP 与更新时自动写入,避免应用漏赋值留下空时间。