> 技术文档 > MySQL常用日期函数总结

MySQL常用日期函数总结


获取当前日期时间

函数 格式 示例 返回数据 NOW() YYYY-MM-dd HH:mm:ss SELECT NOW(); 2025-07-24 21:53:21 CURRENT_DATE() YYYY-MM-dd SELECT CURRENT_DATE(); 2025-07-24 CURRENT_TIME() HH:mm:ss SELECT CURRENT_TIME(); 21:57:06 CURRENT_TIMESTAMP() YYYY-MM-dd HH:mm:ss SELECT CURRENT_TIMESTAMP(); 2025-07-24 21:57:34 UTC_DATE() YYYY-MM-dd SELECT UTC_DATE(); 2025-07-24 UTC_TIME() HH:mm:ss SELECT UTC_TIME(); 14:00:45 UTC_TIMESTAMP() YYYY-MM-dd HH:mm:ss SELECT UTC_TIMESTAMP(); 2025-07-24 14:00:45

日期时间提取

函数 说明 示例 结果 YEAR(date) 提取年份 SELECT YEAR(‘2025-07-24 08:00:00.1’); 2025 MONTH(date) 提取月份 SELECT MONTH(‘2025-07-24 08:00:00.1’); 7 DAY(date) 提取日(1-31) SELECT DAY(‘2025-07-24 08:00:00.1’); 24 HOUR(date) 提取小时 SELECT HOUR(‘2025-07-24 08:00:00.1’); 8 MINUTE(date) 提取分钟 SELECT MINUTE(‘2025-07-24 08:00:00.1’); 0 SECOND(date) 提取秒 SELECT SECOND(‘2025-07-24 08:00:00.1’); 0 MICROSECOND(date) 提取微秒 SELECT MICROSECOND(‘2025-07-24 08:00:00.1’); 100000 WEEK(date) 提取年中的第几周(周日作为第一周开始计算,类似于%U) SELECT SECOND(‘2025-07-24 08:00:00.1’); 29 DAYOFWEEK(date) 提取周的第几天(1=周日,7=周六) SELECT DAYOFWEEK(‘2025-07-24 08:00:00.1’); 5 DAYOFMONTH(date) 提取月的第几天 SELECT DAYOFMONTH(‘2025-07-24 08:00:00.1’); 24 DAYOFYEAR(date) 提取年的第几天 SELECT DAYOFYEAR(‘2025-07-24 08:00:00.1’); 205 QUARTER(date) 提取季度 SELECT QUARTER(‘2025-07-24 08:00:00.1’); 3 DAYNAME(date) 提取星期名称 SELECT DAYNAME(‘2025-07-24 08:00:00.1’); Thursday MONTHNAME(date) 提取秒 SELECT MONTHNAME(‘2025-07-24 08:00:00.1’); July

日期时间计算

日期加减

-- 2025-07-25 08:00:00.100000SELECT DATE_ADD(\'2025-07-24 08:00:00.1\', INTERVAL 1 DAY); -- 2025-07-23 08:00:00.100000SELECT DATE_SUB(\'2025-07-24 08:00:00.1\', INTERVAL 1 DAY); 

单位

单位 说明 示例 YEAR 年 SELECT DATE_ADD(‘2025-07-24 08:00:00.1’, INTERVAL 1 YEAR); QUARTER 季度 SELECT DATE_ADD(‘2025-07-24 08:00:00.1’, INTERVAL 1 QUARTER); MONTH 月 SELECT DATE_ADD(‘2025-07-24 08:00:00.1’, INTERVAL 1 MONTH); WEEK 周 SELECT DATE_ADD(‘2025-07-24 08:00:00.1’, INTERVAL 1 WEEK); DAY 天 SELECT DATE_ADD(‘2025-07-24 08:00:00.1’, INTERVAL 1 DAY); HOUR 小时 SELECT DATE_ADD(‘2025-07-24 08:00:00.1’, INTERVAL 1 HOUR); MINUTE 分 SELECT DATE_ADD(‘2025-07-24 08:00:00.1’, INTERVAL 1 MINUTE); SECOND 秒 SELECT DATE_ADD(‘2025-07-24 08:00:00.1’, INTERVAL 1 SECOND); MICROSECOND 微秒 SELECT DATE_ADD(‘2025-07-24 08:00:00.1’, INTERVAL 1 MICROSECOND);

日期时间格式化

SELECT DATE_FORMAT(NOW(), \'%Y-%m-%d\') AS fmt1, -- 2025-07-24 DATE_FORMAT(NOW(), \'%d/%m/%Y\') AS fmt2, -- 24/07/2025 DATE_FORMAT(NOW(), \'%W, %M %e, %Y\') AS fmt3, -- Thursday, July 24, 2025 DATE_FORMAT(NOW(), \'%H:%i:%s\') AS fmt4, -- 22:33:23 DATE_FORMAT(NOW(), \'%l:%i %p\') AS fmt5; -- 10:33 PM
符号 说明 示例 %Y 4位年份 2025 %y 2位年份 25 %m 月份(00-12) 07 %c 月份(0-12) 7 %M 月份名称 July %b 月份简写 Jul %d 日(00-31) 01 %e 日(0-31) 1 %D 英文后缀的日 1st %H 小时(00-23) 01 %h 小时(01-12) 01 %l 小时(01-12) 01 %i 分钟 (00-59) 01 %s 秒(00-59) 01 %f 微秒 (000000-999999) %p AM/PM PM %W 星期名称 Tuesday %a 星期缩写 Tue %w 星期数字 (0=周日) 4 %U 周 (00-53) 周日开始 29 %u 周 (00-53) 周一开始 30

日期时间转换

函数 说明 示例 STR_TO_DATE(str, format) 字符串转日期 SELECT STR_TO_DATE(‘24,07,2025’, ‘%d,%m,%Y’); FROM_UNIXTIME(ts, format) Unix时间戳转日期 SELECT FROM_UNIXTIME(1753286400, ‘%Y-%m-%d’); UNIX_TIMESTAMP(date) 转为Unix时间戳 SELECT UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP(‘2025-07-24’);

日期时间比较

函数 说明 示例 DATEDIFF(date1, date2) 相差天数(date1-date2) SELECT DATEDIFF(‘2025-07-24’, ‘2025-07-26’); -2 TIMEDIFF(time1, time2) 相差小时(time1-time2) SELECT TIMEDIFF(‘2025-07-24 00:00:00’, ‘2025-07-24 01:00:00’); -1 TIMESTAMPDIFF(unit, date1, date2) 相差时间,单位unit,date2-date1 SELECT TIMESTAMPDIFF(MINUTE, ‘2025-07-24 00:00:00’, ‘2025-07-24 01:00:00’); 60

特殊日期函数

函数 说明 示例 LAST_DAY(date) 月份最后一天 SELECT LAST_DAY(‘2025-07-24 00:00:00’); 2025-07-31 MAKEDATE(year, dayofyear) 根据年+天数创建日期 SELECT MAKEDATE(2025, 32); 2025-02-01 MAKETIME(hour,minute,second) 创建时间 SELECT MAKETIME(13, 1, 1); 13:01:01 PERIOD_ADD(period, months) 增加月份 SELECT PERIOD_ADD(202501,1); 202502 PERIOD_DIFF(period1, period2) 相差月份 SELECT PERIOD_DIFF(202501, 202502); -1 TO_DAYS(date) 从0000-00-00计算天数 SELECT TO_DAYS(‘0000-01-01’); 1 FROM_DAYS(days) 将天数转为日期 SELECT FROM_DAYS(366); 1

实用案例

计算年龄

SELECT birth_date, TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS ageFROM users;

获取本周第一天

-- 获取本周第一天(周一为第一天)SELECT DATE_ADD(CURDATE(), INTERVAL 2 - DAYOFWEEK(CURDATE()) DAY);

月末处理

-- 最后一天则是月末订单否则是普通订单SELECT order_date, IF(order_date = LAST_DAY(order_date), \'月末订单\', \'普通订单\') AS order_typeFROM orders;

时间范围查询

-- 查询最近 1h 以内的日志数据SELECT *FROM logsWHERE log_time BETWEEN DATE_SUB(NOW(), INTERVAL 1 HOUR) AND NOW();

今天起下个工作日计算(排除周末)

SELECT start_date, DATE_ADD(start_date, INTERVAL 5 DAY) AS end_date_naive, DATE_ADD( start_date, INTERVAL 5 + (2 * (WEEK(DATE_ADD(start_date, INTERVAL 5 DAY)) - WEEK(start_date))) DAY ) AS end_date_adjustedFROM projects;

提取JSON字段值

SELECT JSON_EXTRACT(json_column, \'$.key_name\') FROM table_name;

水族观赏鱼