MySQL NOW() 用法与实例

MySQL 中的 NOW() 函数用于获取当前的日期和时间,适用于各种时间数据处理场景。

发布于

MySQL 中的 NOW() 函数是我们获取当前日期和时间的瑞士军刀,它能够精确地返回查询执行时的系统时间。无论是记录数据创建时间、计算时间间隔,还是生成时间戳,这个函数都是开发者的首选工具。想象一下需要记录用户注册时间、跟踪订单处理时间,或者简单地在日志中添加时间标记——NOW() 都能完美胜任这些任务。

函数基本语法

使用 NOW() 函数就像查看墙上的时钟一样简单直接:

NOW([fsp])

其中可选的 fsp 参数用于指定小数秒的精度(0-6),让我们可以获取从秒级到微秒级不同精度的时间戳。

获取当前时间的基本方法

让我们从最简单的用法开始:

SELECT NOW();
-- 返回结果类似: 2023-08-20 15:30:45

SELECT NOW() + 0;
-- 返回数字格式: 20230820153045

第二个例子展示了如何将日期时间值转换为数字格式,这在某些特殊场景下可能有用。

不同精度的时间获取

MySQL 5.6.4 及以上版本支持微秒级精度:

SELECT NOW(3);
-- 返回结果类似: 2023-08-20 15:30:45.123

SELECT NOW(6);
-- 返回结果类似: 2023-08-20 15:30:45.123456

这种高精度时间戳在需要严格时序记录的系统中特别有价值。

在实际应用中的使用

假设我们有一个用户注册表:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at DATETIME DEFAULT NOW(),
    updated_at DATETIME DEFAULT NOW() ON UPDATE NOW()
);

这里我们巧妙地在表定义中使用 NOW() 作为默认值,自动记录创建和更新时间。

与其他时间函数的对比

了解 NOW() 与相似函数的区别很重要:

SELECT NOW(), SYSDATE(), CURRENT_TIMESTAMP(), UTC_TIMESTAMP();
  • NOW() 返回语句开始执行时的时间
  • SYSDATE() 返回函数调用时的精确时间
  • CURRENT_TIMESTAMP()NOW() 的同义词
  • UTC_TIMESTAMP() 返回 UTC 时间而非本地时间

在时间计算中的应用

NOW() 经常用于各种时间计算:

-- 计算3天后的日期
SELECT NOW() + INTERVAL 3 DAY;

-- 计算2小时前的时间
SELECT NOW() - INTERVAL 2 HOUR;

-- 计算两个时间点之间的天数差
SELECT DATEDIFF(NOW(), '2023-01-01') AS days_since_new_year;

在条件筛选中的应用

NOW() 在 WHERE 子句中非常实用:

-- 找出今天创建的订单
SELECT * FROM orders
WHERE DATE(created_at) = DATE(NOW());

-- 找出过去一小时内更新的用户
SELECT * FROM users
WHERE updated_at >= NOW() - INTERVAL 1 HOUR;

格式化时间输出

虽然 NOW() 返回标准格式,但我们可以美化输出:

SELECT DATE_FORMAT(NOW(), '%W, %M %e, %Y at %l:%i %p') AS formatted_time;
-- 返回结果类似: Sunday, August 20, 2023 at 3:30 PM

在事务中的特殊行为

了解 NOW() 在事务中的行为很重要:

START TRANSACTION;
SELECT NOW();
-- 等待几秒...
SELECT NOW();
COMMIT;
-- 两个查询返回相同的时间值

NOW() 在事务中会返回事务开始时间,而 SYSDATE() 则会返回实际调用时间。

性能考虑

虽然 NOW() 非常高效,但在某些场景需要注意:

  • 大数据量查询中多次调用 NOW() 可能影响性能
  • 考虑使用默认值而非触发器来设置时间戳
  • 高并发系统中微秒级精度可能需要权衡

总结

MySQL 的 NOW() 函数是我们处理时间相关需求的得力助手。通过本文,我们掌握了如何获取当前时间、如何控制时间精度、如何在表设计中巧妙使用这个函数,以及各种实际应用场景。从简单的记录创建时间到复杂的时间计算,NOW() 都能提供简单而强大的解决方案。理解它与相似函数的区别,以及在不同上下文中的行为特点,可以帮助我们写出更可靠、更高效的 SQL 查询。无论是开发小型应用还是企业级系统,NOW() 都是每个 MySQL 开发者工具箱中不可或缺的工具。