MySQL 获取当前时间的完整指南
一、基础时间函数
-- 返回 '2024-01-15 14:30:45' 格式
SELECT NOW();
-- 返回 '2024-01-15 14:30:45' 格式
SELECT CURRENT_TIMESTAMP();
-- 返回 '2024-01-15 14:30:45' 格式
SELECT LOCALTIME();
-- 返回 '2024-01-15 14:30:45' 格式
SELECT LOCALTIMESTAMP();
-- 返回 '2024-01-15' 格式
SELECT CURDATE();
-- 返回 '2024-01-15' 格式
SELECT CURRENT_DATE();
-- 返回 '2024-01-15' 格式
SELECT CURRENT_DATE;
-- 返回 '14:30:45' 格式
SELECT CURTIME();
-- 返回 '14:30:45' 格式
SELECT CURRENT_TIME();
-- 返回 '14:30:45' 格式
SELECT CURRENT_TIME;
二、UNIX 时间戳函数
-- 返回当前 Unix 时间戳(秒级)
SELECT UNIX_TIMESTAMP();
-- 返回指定时间的 Unix 时间戳
SELECT UNIX_TIMESTAMP('2024-01-15 14:30:45');
-- 将 Unix 时间戳转为日期时间
SELECT FROM_UNIXTIME(1705303845);
-- 格式化输出
SELECT FROM_UNIXTIME(1705303845, '%Y-%m-%d %H:%i:%s');
三、系统级时间函数
-- 返回函数执行时的时间(每次调用可能不同)
SELECT SYSDATE();
-- 与 NOW() 对比
SELECT NOW(), SLEEP(2), NOW(), SYSDATE();
输出示例:
++-+++
| NOW() | SLEEP(2) | NOW() | SYSDATE() |
++-+++
| 2024-01-15 14:30:45 | 0 | 2024-01-15 14:30:45 | 2024-01-15 14:30:47 |
++-+++
-- 获取 UTC 日期时间
SELECT UTC_TIMESTAMP();
-- 获取 UTC 日期
SELECT UTC_DATE();
-- 获取 UTC 时间
SELECT UTC_TIME();
四、格式化输出
-- 标准格式
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
-- 中文格式
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分%s秒');
-- 简洁格式
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s');
-- 年-月-日
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
-- 月/日/年(美式)
SELECT DATE_FORMAT(NOW(), '%m/%d/%Y');
-- 日-月-年(欧式)
SELECT DATE_FORMAT(NOW(), '%d-%m-%Y');
-- 12小时制
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i:%s %p');
-- 24小时制
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
五、实际应用场景
-- 创建表时设置默认时间
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
order_data VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 插入数据
INSERT INTO orders (order_data) VALUES ('订单数据');
-- 查询今天的数据
SELECT * FROM logs WHERE DATE(created_time) = CURDATE();
-- 查询最近一小时的数据
SELECT * FROM logs WHERE created_time > NOW() - INTERVAL 1 HOUR;
-- 查询本周数据
SELECT * FROM logs WHERE YEARWEEK(created_time) = YEARWEEK(NOW());
-- 加减时间
SELECT
NOW() as 当前时间,
NOW() + INTERVAL 1 HOUR as 一小时后,
NOW() - INTERVAL 1 DAY as 一天前,
NOW() + INTERVAL 1 MONTH as 一月后;
-- 日期差计算
SELECT DATEDIFF('2024-01-20', CURDATE()) as 天数差;
六、性能优化技巧
-- 不推荐(无法使用索引)
SELECT * FROM orders WHERE DATE(created_time) = '2024-01-15';
-- 推荐(可以使用索引)
SELECT * FROM orders
WHERE created_time >= '2024-01-15 00:00:00'
AND created_time < '2024-01-16 00:00:00';
-- 在应用层计算时间范围
SET @start_time = '2024-01-15 00:00:00';
SET @end_time = '2024-01-16 00:00:00';
SELECT * FROM orders
WHERE created_time BETWEEN @start_time AND @end_time;
七、时区处理
-- 查看当前时区
SELECT @@global.time_zone, @@session.time_zone;
-- 设置会话时区
SET time_zone = '+08:00';
-- 查看当前时间(带时区)
SELECT NOW(), CONVERT_TZ(NOW(), '+00:00', '+08:00') as 北京时间;
-- 将 UTC 时间转为北京时间
SELECT
UTC_TIMESTAMP() as UTC时间,
CONVERT_TZ(UTC_TIMESTAMP(), '+00:00', '+08:00') as 北京时间;
-- 将时间转为其他时区
SELECT
NOW() as 当前时间,
CONVERT_TZ(NOW(), '+08:00', '+09:00') as 东京时间,
CONVERT_TZ(NOW(), '+08:00', '-05:00') as 纽约时间;
八、高级时间操作
-- 提取时间各部分
SELECT
NOW() as 完整时间,
YEAR(NOW()) as 年,
MONTH(NOW()) as 月,
DAY(NOW()) as 日,
HOUR(NOW()) as 时,
MINUTE(NOW()) as 分,
SECOND(NOW()) as 秒,
DAYNAME(NOW()) as 星期,
MONTHNAME(NOW()) as 月份名;
-- 时间比较
SELECT
NOW() as 当前时间,
'2024-01-20 00:00:00' as 目标时间,
TIMESTAMPDIFF(HOUR, NOW(), '2024-01-20 00:00:00') as 相差小时数,
TIMESTAMPDIFF(DAY, NOW(), '2024-01-20 00:00:00') as 相差天数;
九、常用函数速查表
| 需求场景 | 推荐函数 | 示例 | ||-|| | 获取当前完整时间 | NOW()
| SELECT NOW();
| | 仅获取日期 | CURDATE()
| SELECT CURDATE();
| | 仅获取时间 | CURTIME()
| SELECT CURTIME();
| | 获取时间戳 | UNIX_TIMESTAMP()
| SELECT UNIX_TIMESTAMP();
| | 时间格式化 | DATE_FORMAT()
| SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
| | 时区转换 | CONVERT_TZ()
| SELECT CONVERT_TZ(NOW(), '+00:00', '+08:00');
| | 时间计算 | INTERVAL
| SELECT NOW() + INTERVAL 1 DAY;
|
十、最佳实践总结
-- 使用 TIMESTAMP 类型(自动时区转换)
CREATE TABLE example (
id INT,
event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 使用 DATETIME 类型(固定时间)
CREATE TABLE example2 (
id INT,
event_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
Python 示例
import mysql.connector
from datetime import datetime
conn = mysql.connector.connect(...)
cursor = conn.cursor()
使用数据库当前时间
cursor.execute("INSERT INTO logs (message, created_at) VALUES (%s, NOW())",
("系统消息",))
或使用应用层时间
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
cursor.execute("INSERT INTO logs (message, created_at) VALUES (%s, %s)",
("系统消息", current_time))
通过掌握这些 MySQL 时间函数,您可以高效地处理各种时间相关的业务需求,确保数据的准确性和系统的性能。 另外搭配便捷的80kmMYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。