current_timestamp 是 sql 标准中返回数据库服务器当前日期和时间的无参函数,类型为 timestamp with time zone 或 timestamp,具体取决于数据库实现。

CURRENT_TIMESTAMP 是什么,它返回什么类型?
CURRENT_TIMESTAMP 是 SQL 标准中的一个无参函数(或伪列),用于返回数据库服务器当前的日期和时间。它返回的是 TIMESTAMP WITH TIME ZONE 或 TIMESTAMP 类型,具体取决于数据库实现:PostgreSQL 默认带时区,MySQL 5.6+ 返回无时区的 TIMESTAMP,而 SQL Server 的 CURRENT_TIMESTAMP 等价于 GETDATE()(不带时区)。
- 它不是客户端时间,而是数据库服务进程所在系统的时间
- 不受客户端连接时区设置影响(但某些 DBMS 如 MySQL 在会话级可被
SET time_zone调整显示行为) - 在一条语句中多次出现
CURRENT_TIMESTAMP,值始终一致(语句级常量)
在 INSERT 和 UPDATE 中直接使用 CURRENT_TIMESTAMP
这是最常见也最安全的用法——让数据库自动填充时间戳字段,避免应用层传入时间引发时钟偏差或格式错误。
INSERT INTO logs (message, created_at) VALUES ('User login', CURRENT_TIMESTAMP);
UPDATE users SET last_seen = CURRENT_TIMESTAMP WHERE id = 123;
- 不要加括号写成
CURRENT_TIMESTAMP()(除 MySQL 兼容模式外,标准 SQL 不接受括号) - 如果字段定义为
NOT NULL DEFAULT CURRENT_TIMESTAMP(如 MySQL),插入时可省略该字段,DB 自动赋值 - PostgreSQL 支持更精确的默认:
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
与 NOW()、SYSDATE 等其他时间函数对比
不同数据库对“当前时间”的命名和行为有差异,混用容易出错:
MySQL:支持
CURRENT_TIMESTAMP、NOW()、SYSDATE();但SYSDATE()是执行时刻时间(函数内多次调用可能不同),而前两者是语句开始时刻PostgreSQL:推荐用
CURRENT_TIMESTAMP或NOW()(二者完全等价),不支持SYSDATEOracle:用
SYSDATE(无时区),CURRENT_TIMESTAMP则返回会话时区下的带时区时间SQL Server:
CURRENT_TIMESTAMP是GETDATE()的同义词,推荐用后者以明确意图在跨数据库迁移时,不要假设
CURRENT_TIMESTAMP行为完全一致如果需要毫秒精度,PostgreSQL 默认支持,MySQL 需声明字段为
TIMESTAMP(3),SQL Server 需用GETDATE()或SYSDATETIME()
WHERE 条件中用 CURRENT_TIMESTAMP 做时间范围过滤
可以,但要注意索引是否生效以及时区一致性:
SELECT * FROM events WHERE start_time > CURRENT_TIMESTAMP;
SELECT * FROM sessions WHERE expires_at
- 如果
expires_at是TIMESTAMP WITHOUT TIME ZONE,而CURRENT_TIMESTAMP带时区,比较前会隐式转换,可能意外跳过数据(尤其跨时区部署时) - 更稳妥的做法是统一使用带时区类型,或显式转换:
CURRENT_TIMESTAMP AT TIME ZONE 'UTC'(PostgreSQL)或CONVERT_TZ(CURRENT_TIMESTAMP, @@session.time_zone, '+00:00')(MySQL) - 对高并发表,这类查询若没走索引,性能会随数据增长快速恶化;确保
start_time或expires_at字段上有索引
时区处理和类型隐式转换是最容易被忽略的两个点,尤其当应用从单机开发环境上线到多时区生产集群时,CURRENT_TIMESTAMP 的行为差异会突然暴露。











