最近我读了一篇关于Oracle数据库中SYSDATE()和CURRENT_DATE()函数区别的长文。这让我想起我曾经研究过MySQL中NOW()和SYSDATE()函数的区别。这两个函数看起来非常相似,在很多(甚至大多数?)情况下,你很难看出它们的区别。但它们并不完全相同。以下是何时使用哪个函数的简要指南。
两者中比较简单的,也可能更符合你的预期,是 SYSDATE()。SYSDATE() 返回的是它执行操作的确切时刻的时间戳(而不仅仅是日期)。
MariaDB [(none)]> select sysdate(); +---------------------+ | sysdate() | +---------------------+ | 2026-01-27 18:09:04 | +---------------------+
很简单。现在(没有双关的意思!)让我们来比较一下 NOW() 和 SYSDATE():
MariaDB [(none)]> select now(), sysdate(); +---------------------+---------------------+ | now() | sysdate() | +---------------------+---------------------+ | 2026-01-27 18:09:50 | 2026-01-27 18:09:50 | +---------------------+---------------------+
嗯……它们是一样的?!
下面这个例子可以说明其中的区别:
MariaDB [(none)]> select now(), sleep(10), sysdate(); +---------------------+-----------+---------------------+ | now() | sleep(10) | sysdate() | +---------------------+-----------+---------------------+ | 2026-01-27 18:11: 12 | 0 | 2026-01-27 18:11: 22 | +---------------------+-----------+---------------------+
区别在于:NOW() 返回的是查询开始执行的时间。如果查询位于触发器或存储过程中,则返回的是代码开始执行的时间。SYSDATE() 始终返回查询执行的瞬间时间。
为什么要使用 NOW() 函数呢?假设你正在处理一个庞大的表(数百万行),并且想要选择所有超过 24 小时的记录。你可以这样做:
SELECT record_id FROM big_table WHERE date_entered < NOW() - INTERVAL 1 DAY;
NOW() 函数会在查询开始时执行一次,并将获取到的值用于每一行的比较。但是,如果将代码更改为 SYSDATE() 函数,运行速度会慢很多,因为它会对每一行都执行一次 SYSDATE() 函数。这不仅会造成大量的处理,还可能导致结果不一致,因为第一行 24 小时前的值可能与第 10,000,000 行的值不同。
对于小型数据集、快速查询等情况,这些因素可能无关紧要,而且如果你的代码已经做了充分的预判,这些因素或许也无关紧要。但当数据规模扩大时,你就应该意识到这些差异了。
顺便一提,MySQL 和 MariaDB 都提供了让 SYSDATE() 函数的行为与 NOW() 函数完全相同的选项(如果您愿意的话)。