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

日期时间计算

日期加减

sql 复制代码
-- 2025-07-25 08:00:00.100000
SELECT DATE_ADD('2025-07-24 08:00:00.1', INTERVAL 1 DAY); 

-- 2025-07-23 08:00:00.100000
SELECT 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);

日期时间格式化

sql 复制代码
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

实用案例

计算年龄

sql 复制代码
SELECT 
    birth_date,
    TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age
FROM users;

获取本周第一天

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

月末处理

sql 复制代码
-- 最后一天则是月末订单否则是普通订单
SELECT 
    order_date,
    IF(order_date = LAST_DAY(order_date), '月末订单', '普通订单') AS order_type
FROM orders;

时间范围查询

sql 复制代码
-- 查询最近 1h 以内的日志数据
SELECT *
FROM logs
WHERE log_time BETWEEN 
    DATE_SUB(NOW(), INTERVAL 1 HOUR) AND NOW();

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

sql 复制代码
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_adjusted
FROM projects;

提取JSON字段值

sql 复制代码
SELECT JSON_EXTRACT(json_column, '$.key_name') FROM table_name;