CURRENT_TIMESTAMP和NOW函数使用
在SQL中,CURRENT_TIMESTAMP
和 NOW()
都可以用来获取当前的日期和时间,但它们在某些方面有所不同:
- 兼容性和标准性:
CURRENT_TIMESTAMP
是SQL标准中的函数,因此在不同的数据库系统中通常具有更好的兼容性。NOW()
是MySQL和其他一些数据库(如MariaDB)中的特定函数,虽然在MySQL中使用广泛,但它不是SQL标准的一部分。
- 返回值:
- 在MySQL中,
CURRENT_TIMESTAMP
和NOW()
返回的结果是相同的,都是当前的日期和时间,格式为YYYY-MM-DD HH:MM:SS
。 - 在某些其他数据库系统中,
CURRENT_TIMESTAMP
可能返回更精确的时间(包括微秒),而NOW()
的行为可能有所不同。
- 在MySQL中,
- 使用场景:
- 如果希望SQL代码在不同的数据库系统中有更好的可移植性,建议使用
CURRENT_TIMESTAMP
。 - 如果确定仅在MySQL环境中工作,
NOW()
和CURRENT_TIMESTAMP
都可以使用,在MySQL中是同义词。
- 如果希望SQL代码在不同的数据库系统中有更好的可移植性,建议使用
- 性能:
两者在性能上的差异通常可以忽略不计,但在某些特定的数据库系统中可能会有所不同。
在大多数情况下,使用 CURRENT_TIMESTAMP
可以使代码具有更好的可移植性。不过,在MySQL中,两者可以互换使用。
下面从多个维度详细比较这两个函数:
一、基本功能对比
特性 |
|
|
返回值 | 当前的日期和时间( | 同左 |
是否是函数? | 是(函数调用) | 否(SQL 保留关键字 / 函数) |
二、行为上的区别
执行时间点不同(关键区别)
这是最重要的一个区别,尤其在存储过程或事务中使用时会体现出来。
NOW()
:- 在查询开始执行时就确定了时间,并在整个查询过程中保持不变。
- 即使该语句执行了几秒钟,在整个语句执行期间,所有对
NOW()
的调用都返回同一个时间戳。
CURRENT_TIMESTAMP
:- 它是一个 SQL 标准关键字,实际行为等价于
NOW()
。 - 但在某些数据库系统中可能略有不同,比如 PostgreSQL 中它等同于
transaction_timestamp()
,即事务开始时间。
- 它是一个 SQL 标准关键字,实际行为等价于
MySQL 中的行为总结:
在 MySQL 中,CURRENT_TIMESTAMP
是NOW()
的别名,两者默认行为完全一样。
2. 作为列默认值使用
场景 |
|
|
用作列默认值(如 | ❌ 不支持 | ✅ 支持 |
多个时间戳字段同时使用时 | —— | ✅ 可配置自动更新机制 |
示例:
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),created_at DATETIME DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP
);
在这个例子中:
created_at
字段会在插入记录时自动设置为当前时间。updated_at
字段会在记录被更新时自动更新为当前时间。
⚠️ 如果写成 DEFAULT NOW()
,MySQL 会报错!
3. 带精度参数
函数 | 是否可指定毫秒精度 |
| ✅ 支持,n 表示小数秒位数(0~6) |
| ✅ 支持,效果与 |
示例:
SELECT NOW(3); -- 返回类似 '2025-07-11 14:23:45.123'
SELECT CURRENT_TIMESTAMP(3); -- 同上
三、兼容性和标准 SQL 对比
特性 |
|
|
是否符合 SQL 标准 | ❌ 否 | ✅ 是 |
跨数据库兼容性 | 差(不是所有数据库都有) | 好(多数数据库支持) |
更推荐用于建表 | ❌ | ✅ |
四、性能差异(一般无差别)
在 MySQL 内部实现中,两个函数都会调用相同的内部函数来获取当前时间戳,因此在性能上没有明显差异。
五、使用建议总结
使用场景 | 推荐方式 |
获取当前时间(简单查询) |
|
插入数据时设置创建时间 | 必须使用 |
设置字段自动更新时间 | 使用 |
想要更高的跨数据库兼容性 | 使用 |
需要毫秒级精度 | 使用 |
示例
-- 获取当前时间
SELECT NOW(); -- 2025-07-11 14:23:45
SELECT CURRENT_TIMESTAMP; -- 同上-- 获取带毫秒的时间
SELECT NOW(3); -- 2025-07-11 14:23:45.123
SELECT CURRENT_TIMESTAMP(6); -- 2025-07-11 14:23:45.123456-- 用作默认值
CREATE TABLE logs (id INT PRIMARY KEY AUTO_INCREMENT,message TEXT,log_time DATETIME DEFAULT CURRENT_TIMESTAMP
);-- 自动更新时间
CREATE TABLE posts (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(100),content TEXT,created_at DATETIME DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP
);
六、其他数据库中的行为
数据库 |
|
|
PostgreSQL | 等于事务开始时间 | 同 |
SQL Server | 存在但不常用 | 推荐使用 |
Oracle | 不存在 | 使用 |
总结
在 MySQL 中,NOW()
和 CURRENT_TIMESTAMP
功能几乎完全一致,但在建表、列默认值、自动更新等场景下,必须使用 CURRENT_TIMESTAMP
,它是更标准、更通用的选择。