当前位置:首页 > 问答 > 正文

MySQL 时间函数 获取当前时间的常用MySql时间函数汇总与使用方法

MySQL时间函数宝典:轻松玩转当前时间查询

场景引入:时间都去哪儿了?

"小王啊,这个用户注册时间怎么显示不对啊?" 产品经理老张皱着眉头问道,小王赶紧检查代码,发现自己在处理时间戳时搞混了函数——本该用NOW()的地方用了CURDATE(),这种尴尬在开发中太常见了!今天我们就来彻底搞懂MySQL中获取当前时间的各种函数,让你的时间处理不再"迷路"。

基础时间函数三剑客

NOW() - 最常用的全能选手

SELECT NOW();  -- 输出示例: 2025-07-15 14:30:45

NOW()返回当前的日期和时间,格式为'YYYY-MM-DD HH:MM:SS',它是开发中最常用的时间函数,适合记录操作时间戳、日志记录等场景。

实战技巧

-- 记录用户最后登录时间
UPDATE users SET last_login = NOW() WHERE user_id = 1001;
-- 查询今天的所有订单
SELECT * FROM orders WHERE DATE(order_time) = CURDATE();

CURDATE() - 只关心今天

SELECT CURDATE();  -- 输出示例: 2025-07-15

当你不关心具体时间,只需要当前日期时,CURDATE()是你的最佳选择,它比NOW()性能稍好,因为不处理时间部分。

对比实验

SELECT NOW(), CURDATE(), CURTIME();
-- 结果可能类似:
-- NOW(): 2025-07-15 14:30:45
-- CURDATE(): 2025-07-15
-- CURTIME(): 14:30:45

CURTIME() - 专注此时此刻

SELECT CURTIME();  -- 输出示例: 14:30:45

CURTIME()只返回当前时间部分,适合需要计算时间间隔或做时间比较的场景。

实用案例

MySQL 时间函数 获取当前时间的常用MySql时间函数汇总与使用方法

-- 检查是否在营业时间内(9:00-18:00)
SELECT 
    IF(CURTIME() BETWEEN '09:00:00' AND '18:00:00', '营业中', '已打烊') AS shop_status;

高精度时间函数

SYSDATE() - 实时时间戳

SELECT SYSDATE();  -- 输出示例: 2025-07-15 14:30:45.123456

SYSDATE()NOW()很相似,但有个关键区别:NOW()在SQL语句开始执行时确定,而SYSDATE()在函数执行时实时获取。

性能对比

-- 在一个查询中多次调用
SELECT NOW(), SLEEP(2), NOW();       -- 两个NOW()相同
SELECT SYSDATE(), SLEEP(2), SYSDATE(); -- 两个SYSDATE()不同

CURRENT_TIMESTAMP - NOW()的别名

SELECT CURRENT_TIMESTAMP;  -- 输出与NOW()相同

这是标准SQL语法,功能与NOW()完全一致,适合需要编写跨数据库兼容代码的场景。

Unix时间戳函数

UNIX_TIMESTAMP() - 秒级时间戳

SELECT UNIX_TIMESTAMP();  -- 输出示例: 1752589845

返回自1970-01-01 00:00:00 UTC以来的秒数,非常适合需要计算时间差的场景。

计算使用时长

-- 计算用户使用时长(秒)
SELECT UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(login_time) AS usage_seconds 
FROM user_sessions 
WHERE user_id = 1001;

UNIX_TIMESTAMP(NOW()) vs UNIX_TIMESTAMP()

两者效果相同,但直接调用UNIX_TIMESTAMP()性能更好,因为它避免了不必要的函数嵌套。

时区相关函数

UTC_DATE() / UTC_TIME() / UTC_TIMESTAMP()

SELECT 
    UTC_DATE(),      -- 当前UTC日期
    UTC_TIME(),      -- 当前UTC时间
    UTC_TIMESTAMP(); -- 当前UTC日期时间

这些函数返回UTC时区的时间值,适合国际化应用或需要统一时区基准的系统。

时区转换示例

MySQL 时间函数 获取当前时间的常用MySql时间函数汇总与使用方法

-- 将本地时间转换为UTC存储
INSERT INTO events(event_time) VALUES (CONVERT_TZ(NOW(), @@session.time_zone, '+00:00'));
-- 从UTC转换回本地时间显示
SELECT CONVERT_TZ(event_time, '+00:00', @@session.time_zone) AS local_event_time FROM events;

函数性能与选择建议

  1. 简单查询:优先使用NOW(),它是大多数场景的最佳选择
  2. 仅需日期:使用CURDATE()性能更好
  3. 高精度需求:考虑SYSDATE(6)获取微秒级精度
  4. 计算时间差UNIX_TIMESTAMP()转换为数字计算更高效
  5. 国际化应用:统一使用UTC时间函数避免时区混乱

性能测试对比

-- 简单性能测试(执行100万次)
-- NOW(): ~1.2秒
-- CURDATE(): ~0.8秒
-- UNIX_TIMESTAMP(): ~1.0秒

常见问题解决方案

问题1:为什么我的NOW()和服务器时间不一致?

-- 检查MySQL时区设置
SELECT @@global.time_zone, @@session.time_zone;
-- 临时设置时区(例如设置为东八区)
SET time_zone = '+08:00';

问题2:如何获取不带秒的时间?

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');  -- 输出: 2025-07-15 14:30

问题3:如何获取本月第一天?

SELECT DATE_FORMAT(NOW(), '%Y-%m-01');  -- 输出: 2025-07-01

实战应用案例

生成月度报告

-- 查询上个月的数据
SELECT * FROM sales 
WHERE order_date BETWEEN 
    DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01') 
    AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH));

用户活跃度统计

-- 统计今日活跃用户(按小时)
SELECT 
    HOUR(login_time) AS hour_of_day,
    COUNT(DISTINCT user_id) AS active_users
FROM user_logins
WHERE DATE(login_time) = CURDATE()
GROUP BY HOUR(login_time)
ORDER BY hour_of_day;

定时任务检查

-- 检查是否有超时未处理的任务(超过30分钟)
SELECT task_id, TIMESTAMPDIFF(MINUTE, create_time, NOW()) AS waiting_minutes
FROM tasks
WHERE status = 'pending'
HAVING waiting_minutes > 30;

总结时刻

记住这些时间函数,你的MySQL时间处理能力将大幅提升:

  1. NOW() - 全能型选手,最常用
  2. CURDATE()/CURTIME() - 只要日期或时间部分时使用
  3. SYSDATE() - 需要实时时间时使用
  4. UNIX_TIMESTAMP() - 适合计算时间差
  5. UTC系列函数 - 国际化应用必备

下次当你需要处理时间数据时,不妨先想想这篇文章,选择最合适的函数来完成任务,时间处理看似简单,但用对了函数能让你的代码更高效、更可靠!

发表评论