CURRENT_TIMESTAMP是SQL标准函数,用于获取数据库服务器当前时间,支持作为列默认值(如PostgreSQL/MySQL 8.0+/SQL Server),但SQLite仅限TEXT或NUMERIC类型且不支持时区,Oracle需用SYSTIMESTAMP;它在INSERT时自动填充,UPDATE时不自动更新,且各数据库时区处理和精度行为存在差异。

CURRENT_TIMESTAMP 是 SQL 标准中用于获取当前数据库服务器时间的函数,它返回带时区的 TIMESTAMP WITH TIME ZONE(或不带时区的 TIMESTAMP,取决于数据库实现),适合用作默认值或显式插入操作时间。
建表时设为列默认值最常用
多数场景下,你不需要每次 INSERT 都手动写时间,而是让数据库自动填充。不同数据库对 CURRENT_TIMESTAMP 的默认值语法略有差异:
- PostgreSQL、MySQL 8.0+、SQL Server 支持直接写
CURRENT_TIMESTAMP作为列默认值 - SQLite 用
CURRENT_TIMESTAMP,但注意它不支持时区,且必须是TEXT或NUMERIC类型才能生效 - Oracle 不支持
CURRENT_TIMESTAMP作默认值,得用SYSTIMESTAMP
示例(PostgreSQL):
CREATE TABLE orders ( id SERIAL PRIMARY KEY, amount DECIMAL(10,2), created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP );
插入时不指定 created_at,数据库会自动填入当前时间(精确到微秒级,含时区)。
INSERT 语句中显式调用要小心时区
如果需要在 INSERT 中显式写入时间,CURRENT_TIMESTAMP 没问题,但要注意:它反映的是数据库服务器本地时区的时间,不是客户端或应用层的时区。
- PostgreSQL 默认返回带时区的时间戳,比如
2024-06-15 14:23:01.123+08 - MySQL 5.6+ 默认返回无时区的
TIMESTAMP,实际存储会转成 UTC,查询时再转回系统时区 —— 这容易导致跨时区应用读取混乱 - 若业务要求统一用 UTC,建议显式用
TIMEZONE('UTC', CURRENT_TIMESTAMP)(PostgreSQL)或CONVERT_TZ(CURRENT_TIMESTAMP, @@session.time_zone, '+00:00')(MySQL)
CURRENT\_TIMESTAMP 和 NOW()、LOCALTIMESTAMP 有啥区别?
它们在多数数据库里行为高度重合,但细节决定是否可移植:
-
CURRENT_TIMESTAMP是 SQL 标准函数,兼容性最好 -
NOW()是 MySQL/PostgreSQL 的别名,但 PostgreSQL 中NOW()总返回带时区时间,而CURRENT_TIMESTAMP可被类型修饰影响(如CURRENT_TIMESTAMP(3)控制毫秒精度) -
LOCALTIMESTAMP在 PostgreSQL 中等价于CURRENT_TIMESTAMP但不带时区;在 Oracle 中它和CURRENT_TIMESTAMP完全不同(前者不含时区偏移) - 不要混用 —— 同一个项目里统一用
CURRENT_TIMESTAMP,避免迁移时出错
更新时间不能只靠 CURRENT\_TIMESTAMP 默认值
CURRENT_TIMESTAMP 默认值只在 INSERT 时触发,UPDATE 不会自动更新。常见错误是以为加了默认值就能当“最后修改时间”用。
- PostgreSQL:需配合触发器或
ON UPDATE CURRENT_TIMESTAMP(但原生不支持,得写触发器) - MySQL:支持
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP - SQLite:不支持
ON UPDATE,只能靠应用层或触发器维护 - 更稳妥的做法:在 UPDATE 语句中显式写
updated_at = CURRENT_TIMESTAMP
容易被忽略的一点:如果表里有两个时间字段(如 created_at 和 updated_at),且都设了 CURRENT_TIMESTAMP 默认值,但没约束 created_at 不可为空或不可更新,就可能在 UPDATE 时意外覆盖创建时间 —— 建议给 created_at 加 NOT NULL 并避免在 UPDATE 中赋值。

















