- 1 1. 介绍
- 2 2. MySQL 获取当前日期/时间的函数(对比表)
- 3 3. NOW() 函数细节
- 4 4. SYSDATE() 函数特性
- 5 5. CURTIME() 和 CURRENT_TIME()
- 6 6. 使用当前时间的实际查询示例
- 7 7. 常见问题解答 (FAQ)
- 8 8. Summary
1. 介绍
在 MySQL 中获取当前时间是数据库管理的关键部分。
例如,您可能需要在以下情形中检索当前时间:
- 在插入数据时自动记录创建时间戳(例如,新用户注册时的时间戳)
- 记录用户登录时间(例如,管理登录历史)
- 在特定时间范围内检索数据(例如,获取过去 24 小时的订单历史)
- 记录系统执行日志(例如,管理错误日志和事件日志)
正如您所见,正确获取“当前时间”用于数据管理和日志记录对于数据库的运行至关重要。
在本文中,我们将详细说明如何在 MySQL 中获取当前时间,并提供真实的 SQL 查询示例。
我们还将介绍常用函数之间的差异、如何选择合适的函数以及实用的查询示例——对初学者到中级用户都很有帮助。
2. MySQL 获取当前日期/时间的函数(对比表)
MySQL 提供了多种函数来获取当前时间。
为您的使用场景选择合适的函数很重要,但许多人对这些差异感到困惑。
在本节中,我们比较了 MySQL 中用于获取当前日期/时间的主要函数,并详细说明它们的特性。
2.1 MySQL 时间函数对比表
| Function | What it returns | Format | Notes |
|---|---|---|---|
| NOW() | Current date and time | YYYY-MM-DD HH:MM:SS | Most commonly used |
| SYSDATE() | Date and time at execution | YYYY-MM-DD HH:MM:SS | Unlike NOW(), it can change on each execution |
| CURTIME() | Current time | HH:MM:SS | Time only (no date) |
| CURRENT_TIME() | Current time | HH:MM:SS | Same as CURTIME() |
| CURRENT_TIMESTAMP() | Current date and time | YYYY-MM-DD HH:MM:SS | Almost the same as NOW() |
| UTC_TIMESTAMP() | Current UTC date and time | YYYY-MM-DD HH:MM:SS | Time zone is fixed to UTC |
从上表可以看出,大多数函数返回“当前日期和时间”或“当前时间”,但最佳函数取决于您的目的。
2.2 各函数概述与特性
NOW() 函数
- 获取当前日期和时间的最常用函数
- 返回 SQL 语句开始执行时的时间
- 在插入或更新数据时常用于时间戳
SELECT NOW();
示例输出
2025-02-14 15:30:45
SYSDATE() 函数
- 在执行时获取当前时间
- 与 NOW() 不同,SYSDATE() 在每次求值时可能返回不同的值(即使在同一事务中也可能变化)
SELECT SYSDATE();
示例输出
2025-02-14 15:30:47
CURTIME() 函数
- 仅获取时间(HH:MM:SS)
- 在不需要日期时很有用
SELECT CURTIME();
示例输出
15:30:45
CURRENT_TIME() 函数
- 与 CURTIME() 功能相同
- 函数名符合 SQL 标准
SELECT CURRENT_TIME();
示例输出
15:30:45
CURRENT_TIMESTAMP() 函数
- 行为类似于 NOW()
- 可以作为列的
DEFAULT值指定(通常比NOW()更适合作为默认值)SELECT CURRENT_TIMESTAMP();
示例输出
2025-02-14 15:30:45
在创建表时设为默认值:
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
UTC_TIMESTAMP() 函数
- 获取当前 UTC(协调世界时)
- 不受服务器时区影响,能够提供一致的时间戳
SELECT UTC_TIMESTAMP();
示例输出
2025-02-14 06:30:45
2.3 应该使用哪个函数?
| Use case | Recommended function |
|---|---|
| Get the current date and time | NOW() |
| Get a different timestamp each time within a transaction | SYSDATE() |
| Need only the current time (HH:MM:SS) | CURTIME() or CURRENT_TIME() |
| Set as a table default value | CURRENT_TIMESTAMP() |
| Get UTC time | UTC_TIMESTAMP() |
一般来说,对于常规的日期/时间获取,NOW() 通常是正确的选择。
然而,根据具体使用场景选择最合适的函数可以实现更灵活、更可靠的数据操作。
3. NOW() 函数细节
MySQL 的 NOW() 函数是获取当前日期和时间(日期+时间)最常用的函数。
它广泛用于在数据库中存储时间戳以及在特定时间范围内检索数据。
3.1 NOW() 的基本用法
NOW() 的语法
SELECT NOW();
示例输出
2025-02-14 15:30:45
- 输出格式为
YYYY-MM-DD HH:MM:SS(年-月-日 时:分:秒)。 - 时间基于 MySQL 的默认时区设置获取。
3.2 NOW() 的常见用例
① 插入数据时记录当前时间
在向数据库插入数据时,可以使用 NOW() 记录创建时间戳。
INSERT INTO users (name, created_at) VALUES ('Sato', NOW());
② 更新数据时记录当前时间
UPDATE users SET last_login = NOW() WHERE id = 1;
③ 从特定时间段检索数据
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 1 DAY;
- 通过指定
INTERVAL 1 DAY,可以检索“过去 1 天的数据”。
3.3 返回类型及如何更改输出格式
NOW() 的返回类型
DATETIME类型(YYYY-MM-DD HH:MM:SS)- 也可以视为字符串
SELECT NOW(), typeof(NOW());
如何更改格式
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_time;
示例输出
2025-02-14 15:30:45
3.4 NOW() 与 SYSDATE() 的区别
| Function | When it’s evaluated | Notes |
|---|---|---|
| NOW() | At query start | Returns a fixed timestamp for the statement |
| SYSDATE() | At execution time | Can return different timestamps within the same statement |
SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();
示例输出
NOW() | SLEEP(3) | NOW()
2025-02-14 15:30:45 | wait 3 seconds | 2025-02-14 15:30:45
SYSDATE() | SLEEP(3) | SYSDATE()
2025-02-14 15:30:45 | wait 3 seconds | 2025-02-14 15:30:48
🚨 如果您在处理事务,建议使用 NOW() 以保持一致性。
3.5 NOW() 的限制和注意事项
① 受时区影响
SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
② 对于表的默认值,请使用 CURRENT_TIMESTAMP
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3.6 NOW() 小结
NOW()是 MySQL 中获取当前日期和时间的最常用函数。- 它可用于插入、更新以及检索基于时间的数据。
- 在事务中需要一致时间戳时使用
NOW()。 SYSDATE()在每次求值时返回不同的时间,因此在需要精确执行时间时使用它。- 使用
CONVERT_TZ()可获取不同时区的时间。
📌 结论:在大多数情况下,NOW() 是获取 MySQL 当前日期和时间的最佳选择。

4. SYSDATE() 函数特性
SYSDATE() 函数是获取 MySQL 当前日期和时间的另一种方式,但其行为与 NOW() 不同。
在本节中,我们将解释 SYSDATE() 的基本用法、它与 NOW() 的区别以及重要注意事项。
4.1 SYSDATE() 是什么?
SYSDATE() 是一个 在语句执行时返回时间 的函数。
不同于 NOW(),它 在每次求值时返回不同的时间戳。
SYSDATE() 语法
SELECT SYSDATE();
示例输出
2025-02-14 16:00:45
- 以
YYYY-MM-DD HH:MM:SS格式返回 - 表示 查询执行的瞬间
4.2 SYSDATE() 与 NOW() 的区别
| Function | When it’s evaluated | Notes |
|---|---|---|
| NOW() | At query start | Returns a fixed timestamp for the statement |
| SYSDATE() | At execution time | Returns a different timestamp each time |
行为比较:NOW() 与 SYSDATE()
SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();
示例输出
NOW() | SLEEP(3) | NOW()
2025-02-14 16:00:45 | wait 3 seconds | 2025-02-14 16:00:45
SYSDATE() | SLEEP(3) | SYSDATE()
2025-02-14 16:00:45 | wait 3 seconds | 2025-02-14 16:00:48
📌 关键点
NOW()保持语句开始时的时间戳,因此不会改变。SYSDATE()在每次求值时返回不同的时间戳,因此在 3 秒后会改变。
🚨 在事务处理中使用 NOW()
- 因为在 多线程环境 中
SYSDATE()的行为可能与NOW()不同,通常建议使用NOW()以确保事务的一致性。
4.3 SYSDATE() 的使用示例
① 插入数据时记录当前时间
INSERT INTO logs (event, created_at) VALUES ('User login', SYSDATE());
② 更新数据时记录当前时间
UPDATE users SET last_login = SYSDATE() WHERE id = 1;
③ 以特定格式获取当前时间
SELECT DATE_FORMAT(SYSDATE(), '%Y-%m-%d %H:%i:%s') AS formatted_time;
示例输出
2025-02-14 16:05:30
4.4 SYSDATE() 的限制与注意事项
① 事务行为
NOW()保持语句开始时的时间戳,因此在事务中可以保持一致使用。SYSDATE()每次调用都会返回不同的时间戳,在事务中可能出现时间漂移。
② 不能作为 DEFAULT 值使用
SYSDATE()不能设为表列的DEFAULT值。
✅ 解决方案: 使用 DEFAULT CURRENT_TIMESTAMP。
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
4.5 何时使用 SYSDATE()?
| Use case | Recommended function |
|---|---|
| Typical current timestamp retrieval | NOW() |
| Use a consistent timestamp within a transaction | NOW() |
| Need the exact execution time | SYSDATE() |
🚀 SYSDATE() 适用于实时日志记录,但不适合事务处理。
4.6 SYSDATE() 小结
- SYSDATE() 在执行时获取时间戳,区别于
NOW()。 - 由于每次可能返回不同的值,适合实时日志记录。
- 若需事务一致性,推荐使用
NOW()。 - 默认值请使用
CURRENT_TIMESTAMP。
📌 结论:一般的时间戳获取使用 NOW() 最佳;若需精确的执行时间,则选择 SYSDATE()。
5. CURTIME() 和 CURRENT_TIME()
当你想在 MySQL 中获取当前时间时,CURTIME() 和 CURRENT_TIME() 用于只需要 时间(HH:MM:SS) 的场景。
本节将解释它们的基本用法、差异以及实际示例。
5.1 什么是 CURTIME()?
CURTIME() 是一个 获取 MySQL 当前时间(时、分、秒) 的函数。
其关键特性是 不包含日期——仅返回时间部分。
CURTIME() 语法
SELECT CURTIME();
示例输出
16:30:45
- 格式:
HH:MM:SS - 受服务器时区设置影响
- 与
NOW()不同,适用于不需要日期信息的场景
5.2 什么是 CURRENT_TIME()?
CURRENT_TIME() 与 CURTIME() 类似,都是 获取当前时间(HH:MM:SS) 的函数。
在实际使用中,它的行为 与 CURTIME() 完全相同。
CURRENT_TIME() 语法
SELECT CURRENT_TIME();
示例输出
16:30:45
📌 有什么区别?
CURTIME()为 MySQL 专有CURRENT_TIME()为 SQL 标准- 二者行为相同
- 根据可读性偏好选择(性能无差异)
5.3 CURTIME() 与 CURRENT_TIME() 对比
| Function | What it returns | Format | Notes |
|---|---|---|---|
| CURTIME() | Current time (hour/minute/second) | HH:MM:SS | MySQL-specific function |
| CURRENT_TIME() | Current time (hour/minute/second) | HH:MM:SS | SQL-standard function |
5.4 CURTIME() / CURRENT_TIME() 实际示例
① 插入数据时记录当前时间
INSERT INTO user_logs (event, event_time) VALUES ('Login', CURTIME());
② 过滤(检索特定时间范围内的数据)
SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00';
③ 改变精度(包含毫秒)
SELECT CURTIME(3); -- Display up to 3 fractional digits
示例输出
16:30:45.123
5.5 CURTIME() / CURRENT_TIME() 的限制与注意事项
① 没有日期信息,必要时需与日期组合使用
SELECT CONCAT(CURDATE(), ' ', CURTIME()) AS full_datetime;
② 作为 DEFAULT 值使用时
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time TIME DEFAULT CURTIME()
);
5.6 何时使用 CURTIME() / CURRENT_TIME()?
| Use case | Recommended function |
|---|---|
| Need only the current time (hour/minute/second) | CURTIME() or CURRENT_TIME() |
| Need current date and time | NOW() |
| Need millisecond precision | CURTIME(3) |
📌 在大多数情况下,CURTIME() 或 CURRENT_TIME() 都可以正常工作。
选择你觉得更易读的那个。
5.7 CURTIME() / CURRENT_TIME() 的总结
CURTIME()是 MySQL 特有的;CURRENT_TIME()是 SQL 标准的- 两者都检索当前时间 (HH:MM:SS)
- 使用
CURTIME(3)或DATE_FORMAT()来调整格式/精度 - 如果需要日期,请与
CURDATE()结合使用或使用NOW() - 对于默认值,通常使用
CURRENT_TIMESTAMP
📌 结论:如果您只需要当前时间,CURTIME() 是一个可靠的选择。
6. 使用当前时间的实际查询示例
现在您已经了解如何在 MySQL 中检索当前时间,让我们来看看实际使用方法。
在本节中,我们将介绍使用当前时间的真实世界查询示例。
您将学习适用于日常数据库任务(如插入、更新和搜索)的实用技巧。
6.1 在插入数据时记录当前时间
① 在用户注册时记录当前时间
INSERT INTO users (name, email, created_at)
VALUES ('Sato', 'sato@example.com', NOW());
6.2 在更新数据时记录当前时间
② 记录用户的最后登录时间戳
UPDATE users SET last_login = NOW() WHERE id = 1;
6.3 检索过去 N 天的数据
③ 检索过去 7 天内的订单数据
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;
6.4 检索特定时间范围内创建的数据
④ 检索今天 9:00 AM 至 6:00 PM 之间创建的数据
SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00';
6.5 考虑时区检索当前时间
⑤ 将 UTC 时间转换为日本时间 (JST)
SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
6.6 将记录创建时间默认设置为当前时间戳
⑥ 自动将 created_at 设置为当前时间戳
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
6.7 在一定时间后删除数据
⑦ 删除 30 天前的旧数据
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;
6.8 以毫秒(微秒)精度获取当前时间
⑧ 以毫秒精度获取当前时间戳
SELECT NOW(3);
示例输出
2025-02-14 16:30:45.123
6.9 用例选择指南
| Use case | Recommended function | Example |
|---|---|---|
| Record the current time when inserting data | NOW() | INSERT INTO users (name, created_at) VALUES ('Sato', NOW()); |
| Record the current time when updating data | NOW() | UPDATE users SET last_login = NOW() WHERE id = 1; |
| Retrieve data from the past N days | NOW() - INTERVAL X DAY | SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY; |
| Retrieve data within a specific time range | CURTIME() | SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00'; |
| Convert UTC time to JST | CONVERT_TZ() | SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo'); |
| Delete old data (older than 30 days) | NOW() - INTERVAL X DAY | DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY; |
6.10 总结
NOW()处理基本的当前时间戳检索CURTIME()和CURRENT_TIME()在您只需要时间时非常有用- 您可以使用当前时间进行时间窗口查询、按时间过滤以及毫秒精度时间戳
- 由于时间戳取决于时区,请使用
CONVERT_TZ()来获取正确时间 - 对于数据库大小管理,设计自动删除旧数据的机制也很重要
📌 结论:有效使用当前时间可以帮助您在 MySQL 中更高效地管理数据。
7. 常见问题解答 (FAQ)
以下是关于在 MySQL 中获取当前时间的常见问题解答 (FAQ)。
每个问题都以清晰简洁的方式给出答案。
7.1 NOW() 和 SYSDATE() 有什么区别?
答案
NOW() 和 SYSDATE() 都检索当前日期和时间,但它们在值何时被求值方面不同。
| Function | When it’s evaluated | Notes |
|---|---|---|
| NOW() | At query start | Returns a fixed timestamp for the statement |
| SYSDATE() | At execution time | Returns a different timestamp on each evaluation |
测试示例
SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();
示例输出
NOW() | SLEEP(3) | NOW()
2025-02-14 16:30:45 | wait 3 seconds | 2025-02-14 16:30:45
SYSDATE() | SLEEP(3) | SYSDATE()
2025-02-14 16:30:45 | wait 3 seconds | 2025-02-14 16:30:48
🚨 对于事务处理,通常推荐使用 NOW()。
7.2 CURRENT_TIMESTAMP() 和 NOW() 是一样的吗?
Answer
它们的行为几乎相同,但 CURRENT_TIMESTAMP() 可以用作 DEFAULT 值。
Example when creating a table
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
7.3 如何在特定时区获取当前时间?
Answer
SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
7.4 如何自动记录当前时间?
Answer
创建表时,指定 DEFAULT CURRENT_TIMESTAMP,即可在 created_at 中自动存储当前时间。
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
7.5 如何检索过去 N 天的数据?
Answer
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;
7.6 如何获取带有毫秒(微秒)精度的当前时间?
Answer
SELECT NOW(3);
Example output
2025-02-14 16:30:45.123
7.7 Summary
NOW()与SYSDATE()在评估时机上不同CURRENT_TIMESTAMP()可以用作DEFAULT值- 使用
CONVERT_TZ()在其他时区检索时间戳 - 使用
DEFAULT CURRENT_TIMESTAMP自动记录创建时间戳 - 使用
NOW() - INTERVAL X DAY检索过去 X 天的数据 NOW(3)或NOW(6)支持毫秒/微秒精度的时间戳
📌 结论:选择合适的 MySQL 时间函数对于处理当前时间戳至关重要。
8. Summary
在本文中,我们解释了如何在 MySQL 中获取当前时间。重点关注 NOW() 函数,我们介绍了相似函数之间的差异、实用查询示例以及重要注意事项。
8.1 获取当前时间的主要 MySQL 函数
| Function | What it returns | Format | Notes |
|---|---|---|---|
| NOW() | Current date and time | YYYY-MM-DD HH:MM:SS | Most common function |
| SYSDATE() | Date and time at execution | YYYY-MM-DD HH:MM:SS | Can return different values on each evaluation |
| CURTIME() | Current time | HH:MM:SS | Time only (no date) |
| CURRENT_TIME() | Current time | HH:MM:SS | Same as CURTIME() |
| CURRENT_TIMESTAMP() | Current date and time | YYYY-MM-DD HH:MM:SS | Almost the same as NOW() |
| UTC_TIMESTAMP() | Current UTC date and time | YYYY-MM-DD HH:MM:SS | Time zone fixed to UTC |
📌 结论:
- 对于一般的当前时间戳检索,
NOW()通常是最佳选择。 - 如果需要精确的执行时间,请使用
SYSDATE()。 - 如果只需要时间(不包括日期),请选择
CURTIME()。
8.2 使用当前时间的实用查询
Record the current time when inserting data
INSERT INTO users (name, created_at) VALUES ('Sato', NOW());
Record the current time when updating data
UPDATE users SET last_login = NOW() WHERE id = 1;
Retrieve data from the past 7 days
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;
Retrieve time with time zones in mind
SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
Delete old data (older than 30 days)
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;
8.3 关于时区的说明
- MySQL 的
NOW()取决于 默认时区设置,因此在不同环境下结果可能会不同。 - 使用
CONVERT_TZ()在其他时区检索时间戳。 - 如果想更改服务器时区:
SET GLOBAL time_zone = 'Asia/Tokyo';
8.4 MySQL 当前时间函数 FAQ
Q1. NOW() 与 SYSDATE() 有何区别?
➡ NOW() 在查询开始时获取时间,而 SYSDATE() 在执行时获取时间。
Q2. CURRENT_TIMESTAMP() 和 NOW() 是一样的吗?
➡ 它们几乎相同,但 CURRENT_TIMESTAMP() 可以用作 DEFAULT 值。
Q3. 如何获取带有毫秒(微秒)精度的当前时间?
➡ 使用 NOW(3)(毫秒)或 NOW(6)(微秒)。
SELECT NOW(3); -- Example: 2025-02-14 16:30:45.123
8.5 Summary
- 在 MySQL 中,选择正确的当前时间函数非常重要 .
- 在常规情况下使用
NOW(),在需要精确执行时间戳时使用SYSDATE(). - 仅获取时间时使用
CURTIME(),进行时区转换时使用CONVERT_TZ(). - 在插入、更新、查询和删除操作中都可以使用当前时间 .
📌 结论:掌握 MySQL 时间函数,以更高效地管理数据。


