MySQL的sysdate()和now()有什么区别?

在 MySQL 中,SYSDATE() 和 NOW() 函数都用于获取当前的日期和时间,但它们之间存在一些关键区别,下面从定义、行为、使用场景等方面为你详细介绍。

基本定义

  • NOW() 函数:返回执行该函数时的时间戳,该时间戳是在 SQL 语句开始执行时就确定的。也就是说,在同一条 SQL 语句里,无论 NOW() 函数被调用多少次,它返回的时间都是相同的,这个时间是语句开始执行时的时间。
  • SYSDATE() 函数:返回调用该函数瞬间的实际时间。这意味着在同一条 SQL 语句中,若多次调用 SYSDATE() 函数,每次返回的时间可能会有所不同,因为它反映的是调用那一刻的实时时间。

行为差异示例

示例 1:单条 SQL 语句中多次调用函数

-- 多次调用 NOW() 函数
SELECT NOW(), SLEEP(2), NOW();

上述代码先获取当前时间,然后让程序暂停 2 秒,最后再次获取当前时间。由于 NOW() 函数在语句开始执行时就确定了时间,所以两次调用返回的时间是一样的。

-- 多次调用 SYSDATE() 函数
SELECT SYSDATE(), SLEEP(2), SYSDATE();

这里同样先获取当前时间,暂停 2 秒后再次获取。因为 SYSDATE() 返回的是调用瞬间的时间,所以两次调用返回的时间会相差约 2 秒。

示例 2:在存储过程或函数中使用

-- 创建一个存储过程
DELIMITER //
CREATE PROCEDURE test_time_functions()
BEGIN
    DECLARE start_time1 DATETIME;
    DECLARE start_time2 DATETIME;
    DECLARE end_time1 DATETIME;
    DECLARE end_time2 DATETIME;

    SET start_time1 = NOW();
    SET start_time2 = SYSDATE();
    -- 模拟耗时操作
    DO SLEEP(2);
    SET end_time1 = NOW();
    SET end_time2 = SYSDATE();

    SELECT start_time1, start_time2, end_time1, end_time2;
END //
DELIMITER ;

-- 调用存储过程
CALL test_time_functions();

在这个存储过程中,NOW() 函数在存储过程开始执行时就确定了时间,所以 start_time1 和 end_time1 的值是相同的;而 SYSDATE() 函数返回的是调用时的实时时间,所以 start_time2 和 end_time2 的值会相差约 2 秒。

使用场景差异

  • NOW() 函数的使用场景:当你需要在一条 SQL 语句或一个事务中保持时间的一致性时,适合使用 NOW() 函数。例如,在记录日志时,为了确保同一操作的所有相关记录都使用相同的时间戳,就可以使用 NOW() 函数。
-- 插入一条日志记录,使用 NOW() 函数记录操作时间
INSERT INTO log_table (action, time) VALUES ('user login', NOW());

  • SYSDATE() 函数的使用场景:当你需要获取精确的实时时间时,SYSDATE() 函数是更好的选择。比如在实现倒计时、定时任务等功能时,需要获取当前的准确时间,就可以使用 SYSDATE() 函数。
-- 检查当前时间是否在某个特定时间之后
SELECT * FROM tasks WHERE SYSDATE() > start_time;

综上所述,NOW() 和 SYSDATE() 函数虽然都能获取当前时间,但在行为和使用场景上存在明显差异,你可以根据具体需求选择合适的函数。

posted on 2025-04-17 16:12  数据库那些事儿  阅读(199)  评论(0)    收藏  举报