上一篇
"小王,赶紧帮我查下过去30天的用户活跃数据!"——产品经理又在催报表了。
"李哥,系统显示用户订阅过期时间不对啊,少了8小时..."——测试同学发来紧急bug。
作为一名数据库开发或运维人员,这种和时间打交道的场景你一定不陌生,MySQL中的时间计算看似简单,但稍不注意就会掉进时区转换、格式错误的坑里,今天我们就来彻底搞懂MySQL中的时间加减操作,让你的SQL开发不再被时间问题困扰。
在开始计算前,我们先了解MySQL支持的几种时间类型:
最常用的时间加减方法:
-- 加1天 SELECT DATE_ADD('2025-07-01', INTERVAL 1 DAY); -- 减2小时 SELECT DATE_SUB('2025-07-01 12:00:00', INTERVAL 2 HOUR);
支持的时间单位包括:
MySQL也支持更简洁的写法:
-- 等价于DATE_ADD SELECT '2025-07-01' + INTERVAL 1 DAY; -- 等价于DATE_SUB SELECT '2025-07-01' - INTERVAL 1 HOUR;
-- 当前时间戳 SELECT UNIX_TIMESTAMP(); -- 时间转时间戳 SELECT UNIX_TIMESTAMP('2025-07-01 12:00:00'); -- 时间戳转时间 SELECT FROM_UNIXTIME(1740835200);
-- 加1天(86400秒) SELECT FROM_UNIXTIME(UNIX_TIMESTAMP() + 86400); -- 减2小时(7200秒) SELECT FROM_UNIXTIME(UNIX_TIMESTAMP() - 7200);
SELECT * FROM user_activity WHERE activity_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
-- 假设会员时长为3个月 SELECT user_id, DATE_ADD(register_time, INTERVAL 3 MONTH) AS expire_time FROM users;
-- 将UTC时间转换为北京时间(+8小时) SELECT DATE_ADD(utc_time, INTERVAL 8 HOUR) AS beijing_time FROM logs;
-- 假设需要加5个工作日 SET @date = '2025-07-01'; SET @days_to_add = 5; WHILE @days_to_add > 0 DO SET @date = DATE_ADD(@date, INTERVAL 1 DAY); IF DAYOFWEEK(@date) NOT IN (1,7) THEN SET @days_to_add = @days_to_add - 1; END IF; END WHILE; SELECT @date AS workday_after_5;
-- 2024年是闰年,2月有29天 SELECT DATE_ADD('2024-02-28', INTERVAL 1 DAY); -- 结果是2024-02-29
-- 1月31日加1个月会变成2月28日(或29日) SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH); -- 2025-02-28
-- TIME类型超过23:59:59会循环 SELECT '23:59:59' + INTERVAL 2 SECOND; -- 00:00:01
时间计算是SQL开发中最常见的需求之一,掌握这些技巧能让你事半功倍,处理时间时要特别注意时区和边界条件,下次产品经理再要"过去30天的数据"时,你就可以优雅地写出高效的查询了! 基于MySQL 8.0版本,部分函数在早期版本中可能不支持】
本文由 登华荣 于2025-07-31发表在【云服务器提供商】,文中图片由(登华荣)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/494502.html
发表评论