"小王啊,这个用户注册时间怎么显示不对啊?" 产品经理老张皱着眉头问道,小王赶紧检查代码,发现自己在处理时间戳时搞混了函数——本该用NOW()
的地方用了CURDATE()
,这种尴尬在开发中太常见了!今天我们就来彻底搞懂MySQL中获取当前时间的各种函数,让你的时间处理不再"迷路"。
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();
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
SELECT CURTIME(); -- 输出示例: 14:30:45
CURTIME()
只返回当前时间部分,适合需要计算时间间隔或做时间比较的场景。
实用案例:
-- 检查是否在营业时间内(9:00-18:00) SELECT IF(CURTIME() BETWEEN '09:00:00' AND '18:00:00', '营业中', '已打烊') AS shop_status;
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()不同
SELECT CURRENT_TIMESTAMP; -- 输出与NOW()相同
这是标准SQL语法,功能与NOW()
完全一致,适合需要编写跨数据库兼容代码的场景。
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()
性能更好,因为它避免了不必要的函数嵌套。
SELECT UTC_DATE(), -- 当前UTC日期 UTC_TIME(), -- 当前UTC时间 UTC_TIMESTAMP(); -- 当前UTC日期时间
这些函数返回UTC时区的时间值,适合国际化应用或需要统一时区基准的系统。
时区转换示例:
-- 将本地时间转换为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;
NOW()
,它是大多数场景的最佳选择CURDATE()
性能更好SYSDATE(6)
获取微秒级精度UNIX_TIMESTAMP()
转换为数字计算更高效性能测试对比:
-- 简单性能测试(执行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时间处理能力将大幅提升:
NOW()
- 全能型选手,最常用CURDATE()
/CURTIME()
- 只要日期或时间部分时使用SYSDATE()
- 需要实时时间时使用UNIX_TIMESTAMP()
- 适合计算时间差下次当你需要处理时间数据时,不妨先想想这篇文章,选择最合适的函数来完成任务,时间处理看似简单,但用对了函数能让你的代码更高效、更可靠!
本文由 栗雅安 于2025-07-31发表在【云服务器提供商】,文中图片由(栗雅安)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/492900.html
发表评论