MySQL里那些跟时间相关的函数用法和小技巧,聊聊怎么搞定各种时间计算问题
- 问答
- 2026-01-24 11:57:24
- 2
MySQL里有很多跟时间相关的函数,能帮你轻松处理各种时间计算,根据MySQL官方文档,时间类型主要有DATE、TIME、DATETIME和TIMESTAMP,简单说,DATE只存日期,TIME只存时间,DATETIME存日期和时间,TIMESTAMP也存日期和时间但会自动处理时区,理解这些是基础,这样你才知道该用哪个来存数据。
先说获取当前时间的函数,NOW()返回当前日期和时间,比如SELECT NOW()会得到像'2023-10-05 14:30:00'这样的结果,CURDATE()只返回日期,2023-10-05',CURTIME()只返回时间,14:30:00',这些在记录数据创建时间时特别有用,比如在插入记录时用NOW()自动填时间戳,根据MySQL官方文档,还有SYSDATE(),它和NOW()类似,但有点细微差别,NOW()在语句开始时就固定了,SYSDATE()每次调用都重新获取。

接下来是时间计算,DATE_ADD()和DATE_SUB()可以加减时间间隔,SELECT DATE_ADD(NOW(), INTERVAL 1 DAY)就是明天这个时候,INTERVAL后面可以跟DAY、MONTH、YEAR、HOUR等,比如加三个月:DATE_ADD('2023-01-01', INTERVAL 3 MONTH)得到'2023-04-01',DATEDIFF()计算两个日期之间的天数差,比如DATEDIFF('2023-12-31', '2023-01-01')得到364天,TIMEDIFF()计算时间差,比如TIMEDIFF('14:00:00', '10:30:00')得到'03:30:00',这些函数让加减日期变得简单,不用自己算闰年或月份天数。
提取时间部分也很重要,YEAR()、MONTH()、DAY()等函数从日期中提取年份、月份、日,SELECT YEAR('2023-10-05')返回2023,还有HOUR()、MINUTE()、SECOND()用于时间,比如HOUR('14:30:45')返回14,根据MySQL官方文档,EXTRACT()函数更灵活,可以一次提取多个部分,比如SELECT EXTRACT(YEAR_MONTH FROM NOW())返回202310,这在你需要分组或过滤数据时很有用,比如查某个月的数据就用MONTH(date_column) = 10。

格式化时间用DATE_FORMAT(),它可以把日期转换成你想要的格式,比如SELECT DATE_FORMAT(NOW(), '%Y-%m-%d')得到'2023-10-05',格式符很多,%Y是四位年份,%y是两位,%m是月份,%d是日,%H是24小时制小时,DATE_FORMAT(NOW(), '%W, %M %d, %Y')返回'Thursday, October 05, 2023',这样显示给用户看更友好,TIME_FORMAT()类似,但只格式化时间部分。
小技巧方面,处理时区问题,TIMESTAMP类型会自动转换时区,但DATETIME不会,如果你需要存储用户本地时间,要注意这点,可以用CONVERT_TZ()函数转换时区,比如SELECT CONVERT_TZ(NOW(), '+00:00', '+08:00')将UTC时间转成北京时间,计算年龄可以用DATEDIFF和除法,但更准确的是用TIMESTAMPDIFF()函数,比如SELECT TIMESTAMPDIFF(YEAR, '2000-01-01', CURDATE())得到年龄,它会考虑月份和日,比简单减年份准,根据MySQL官方文档,TIMESTAMPDIFF()支持单位如YEAR、MONTH、DAY,计算两个日期之间的差异。

搞定各种时间计算问题,要获取本月的第一天,可以用DATE_FORMAT和CONCAT:SELECT CONCAT(DATE_FORMAT(CURDATE(), '%Y-%m'), '-01'),或者用更直接的方法:SELECT DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)), INTERVAL 1 DAY),LAST_DAY()函数返回月份的最后一天,比如LAST_DAY('2023-10-05')返回'2023-10-31',这样就能动态算月初和月末,另一个常见问题:计算工作日,MySQL没有内置函数,但可以用CASE和日期函数结合,假设周末是周六周日,你可以用日期函数判断星期几,WEEKDAY()返回0到6,0是周一,6是周日,然后跳过这些天,但需要写复杂查询,可能用到循环或临时表。
分组按时间也很实用,比如按周分组销售数据:SELECT YEARWEEK(sale_date), SUM(amount) FROM sales GROUP BY YEARWEEK(sale_date),YEARWEEK()返回年份和周数,这样就能分析每周趋势,根据MySQL官方文档,还有QUARTER()函数返回季度,比如QUARTER('2023-10-05')返回4,方便按季度汇总,时间戳转换,UNIX_TIMESTAMP()把日期转成Unix时间戳,FROM_UNIXTIME()把时间戳转回日期,这在和外部系统集成时有用,比如从API接收时间戳存到数据库:SELECT FROM_UNIXTIME(1696523400)得到'2023-10-05 14:30:00'。
避免常见错误,比较日期时,确保类型一致,如果你用DATETIME和DATE比较,可能因为时间部分而出错,使用DATE()函数提取日期部分,比如WHERE DATE(created_at) = '2023-10-05',避免时间部分干扰,处理NULL时间时,用IFNULL()或COALESCE()设置默认值,防止计算出错,根据MySQL官方文档,时间函数在无效输入时会返回NULL或错误,所以最好先验证数据。
还有,性能小技巧,在查询中避免对时间列用函数,因为那样可能用不上索引,如果created_at有索引,WHERE YEAR(created_at) = 2023不会用索引,但WHERE created_at >= '2023-01-01' AND created_at < '2024-01-01'会用上,这能加快查询速度,MySQL的时间函数丰富,多练习就能熟练,记住关键函数,结合小技巧,比如用INTERVAL做加减、用格式化函数显示、注意时区和索引,就能搞定大多数时间计算问题,从简单日期差到复杂业务逻辑都能应对。
本文由畅苗于2026-01-24发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/85069.html