当前位置: 首页 > news >正文

CURRENT_TIMESTAMP和NOW函数使用

在SQL中,CURRENT_TIMESTAMPNOW() 都可以用来获取当前的日期和时间,但它们在某些方面有所不同:

  1. 兼容性和标准性
    • CURRENT_TIMESTAMP 是SQL标准中的函数,因此在不同的数据库系统中通常具有更好的兼容性。
    • NOW() 是MySQL和其他一些数据库(如MariaDB)中的特定函数,虽然在MySQL中使用广泛,但它不是SQL标准的一部分。
  2. 返回值
    • 在MySQL中,CURRENT_TIMESTAMPNOW() 返回的结果是相同的,都是当前的日期和时间,格式为YYYY-MM-DD HH:MM:SS
    • 在某些其他数据库系统中,CURRENT_TIMESTAMP 可能返回更精确的时间(包括微秒),而 NOW() 的行为可能有所不同。
  3. 使用场景
    • 如果希望SQL代码在不同的数据库系统中有更好的可移植性,建议使用 CURRENT_TIMESTAMP
    • 如果确定仅在MySQL环境中工作,NOW()CURRENT_TIMESTAMP 都可以使用,在MySQL中是同义词。
  4. 性能

两者在性能上的差异通常可以忽略不计,但在某些特定的数据库系统中可能会有所不同。

在大多数情况下,使用 CURRENT_TIMESTAMP可以使代码具有更好的可移植性。不过,在MySQL中,两者可以互换使用。

下面从多个维度详细比较这两个函数:

一、基本功能对比

特性

NOW()

CURRENT_TIMESTAMP

返回值

当前的日期和时间(YYYY-MM-DD HH:MM:SS

同左

是否是函数?

是(函数调用)

否(SQL 保留关键字 / 函数)

二、行为上的区别

执行时间点不同(关键区别)

这是最重要的一个区别,尤其在存储过程或事务中使用时会体现出来

  • NOW()
    • 在查询开始执行时就确定了时间,并在整个查询过程中保持不变。
    • 即使该语句执行了几秒钟,在整个语句执行期间,所有对 NOW() 的调用都返回同一个时间戳
  • CURRENT_TIMESTAMP
    • 它是一个 SQL 标准关键字,实际行为等价于 NOW()
    • 但在某些数据库系统中可能略有不同,比如 PostgreSQL 中它等同于 transaction_timestamp(),即事务开始时间。
MySQL 中的行为总结:
在 MySQL 中,CURRENT_TIMESTAMPNOW() 的别名,两者默认行为完全一样。

2. 作为列默认值使用

场景

NOW()

CURRENT_TIMESTAMP

用作列默认值(如 created_at

❌ 不支持

✅ 支持

多个时间戳字段同时使用时

——

✅ 可配置自动更新机制

示例:
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. 带精度参数

函数

是否可指定毫秒精度

NOW(n)

✅ 支持,n 表示小数秒位数(0~6)

CURRENT_TIMESTAMP(n)

✅ 支持,效果与 NOW(n) 相同

示例:
SELECT NOW(3); -- 返回类似 '2025-07-11 14:23:45.123'
SELECT CURRENT_TIMESTAMP(3); -- 同上

三、兼容性和标准 SQL 对比

特性

NOW()

CURRENT_TIMESTAMP

是否符合 SQL 标准

❌ 否

✅ 是

跨数据库兼容性

差(不是所有数据库都有)

好(多数数据库支持)

更推荐用于建表

四、性能差异(一般无差别)

在 MySQL 内部实现中,两个函数都会调用相同的内部函数来获取当前时间戳,因此在性能上没有明显差异。

五、使用建议总结

使用场景

推荐方式

获取当前时间(简单查询)

NOW()CURRENT_TIMESTAMP 均可

插入数据时设置创建时间

必须使用 CURRENT_TIMESTAMP

设置字段自动更新时间

使用 ON UPDATE CURRENT_TIMESTAMP

想要更高的跨数据库兼容性

使用 CURRENT_TIMESTAMP

需要毫秒级精度

使用 NOW(3)CURRENT_TIMESTAMP(3)

示例

-- 获取当前时间
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
);

六、其他数据库中的行为

数据库

NOW()

CURRENT_TIMESTAMP

PostgreSQL

等于事务开始时间

now()

SQL Server

存在但不常用

推荐使用 GETDATE()

Oracle

不存在

使用 SYSDATECURRENT_TIMESTAMP

总结

在 MySQL 中,NOW()CURRENT_TIMESTAMP 功能几乎完全一致,但在建表、列默认值、自动更新等场景下,必须使用 CURRENT_TIMESTAMP,它是更标准、更通用的选择。

http://www.dtcms.com/a/282648.html

相关文章:

  • Spring Boot 集成 Redis 并调用 Lua 脚本详解
  • multiprocessing.Pool 中的 pickle 详解
  • 文献精读:气候变化、CO2浓度提高和土地利用变化对全球陆地蒸散发的影响分析
  • C++矿井逃生游戏深度解析:迷宫生成与灯光渲染技术 | EasyX实战
  • 45. 跳跃游戏 II
  • 3.1 认识函数
  • 工作第一步建立连接——ssh
  • [MySQL基础1]数据定义语言DDL与数据操作语言DML
  • Transform的重要方法
  • sktime - 时间序列机器学习统一接口
  • Docker——Redis
  • ollama快速部署使用(windows版)
  • Linux三剑客grep、sed、awk
  • 海盗王如何拍摄和打包小地图
  • 在javaScript里删除节点以及添加节点
  • livecharts 装版本8
  • 预训练模型:大规模数据预学习范式——定义、原理与演进逻辑
  • CSS隐藏元素:display:none vs visibility:hidden
  • S7-200 SMART PLC:模拟量模块接线全解析
  • 新手向:自动化图片格式转换工具
  • PyCharm高效入门指南大纲
  • 如何在 Linux 上下载和安装 Conda/Miniconda
  • 基于 Docker 环境的 JupyterHub 详细部署手册
  • VR 污水厂初体验:颠覆传统认知​
  • 广州 VR 森林防火系统功能探究​
  • Harmony-Next鸿蒙实战开发项目-仿小米商城App----V2
  • DOM 规范中的 MutationObserver 接口
  • 【LeetCode 热题 100】543. 二叉树的直径——DFS
  • STM32 写选项字 关键要加载HAL_FLASH_OB_Launch
  • 红黑树、B树、B+树