Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql日期和时间函数

MySQL 日期和时间函数示例详解

作者:xixi_666

本文详细介绍了MySQL中处理日期和时间的各种函数,包括获取当前日期时间、日期提取、格式化和解析、计算和运算、生成和构造、验证和调整、时间戳转换以及实用查询示例,并提供了性能优化建议,感兴趣的朋友跟随小编一起看看吧

一、获取当前日期和时间

1. 获取当前日期和时间

-- 当前完整日期时间
SELECT NOW();               -- 2026-02-28 14:30:45
SELECT CURRENT_TIMESTAMP;   -- 2026-02-28 14:30:45
SELECT LOCALTIME();         -- 2026-02-28 14:30:45
SELECT LOCALTIMESTAMP;      -- 2026-02-28 14:30:45
SELECT SYSDATE();           -- 2026-02-28 14:30:45
-- 细微区别
SELECT NOW(), SLEEP(2), NOW();      -- 两个NOW()值相同
SELECT SYSDATE(), SLEEP(2), SYSDATE(); -- SYSDATE()值不同

2. 获取当前日期(无时间)

SELECT CURDATE();          -- 2026-02-28
SELECT CURRENT_DATE();     -- 2026-02-28
SELECT CURRENT_DATE;       -- 2026-02-28
SELECT DATE(NOW());        -- 2026-02-28

3. 获取当前时间(无日期)

SELECT CURTIME();          -- 14:30:45
SELECT CURRENT_TIME();     -- 14:30:45
SELECT CURRENT_TIME;       -- 14:30:45
SELECT TIME(NOW());        -- 14:30:45

二、日期提取函数

1. 提取日期各部分

-- 提取年份
SELECT YEAR('2026-02-28');          -- 2026
SELECT YEAR(CURDATE());             -- 2026
SELECT YEARWEEK('2026-02-28');      -- 202609
-- 提取季度
SELECT QUARTER('2026-02-28');       -- 1(第1季度)
-- 提取月份
SELECT MONTH('2026-02-28');         -- 2
SELECT MONTHNAME('2026-02-28');     -- February
-- 提取周
SELECT WEEK('2026-02-28');          -- 9(一年中的第几周)
SELECT WEEKOFYEAR('2026-02-28');    -- 9
SELECT WEEKDAY('2026-02-28');       -- 5(0=周一,5=周六)
SELECT DAYOFWEEK('2026-02-28');     -- 7(1=周日,7=周六)
-- 提取日
SELECT DAY('2026-02-28');           -- 28
SELECT DAYOFMONTH('2026-02-28');    -- 28
SELECT DAYOFYEAR('2026-02-28');     -- 59(一年中的第几天)
-- 提取小时、分钟、秒
SELECT HOUR('2026-02-28 14:30:45'); -- 14
SELECT MINUTE('2026-02-28 14:30:45'); -- 30
SELECT SECOND('2026-02-28 14:30:45'); -- 45
-- 提取微秒
SELECT MICROSECOND('2026-02-28 14:30:45.123456'); -- 123456

2. 日期部分组合提取

-- 提取日期时间
SELECT DATE('2026-02-28 14:30:45'); -- 2026-02-28
SELECT TIME('2026-02-28 14:30:45'); -- 14:30:45
-- 提取UNIX时间戳
SELECT UNIX_TIMESTAMP('2026-02-28 14:30:45'); -- 1772303445
SELECT UNIX_TIMESTAMP();            -- 当前时间戳

三、日期格式化和解析

1. 日期格式化(DATE_FORMAT)

-- 基本格式化
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 2026-02-28 14:30:45
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d');          -- 2026/02/28
SELECT DATE_FORMAT(NOW(), '%d-%b-%Y');          -- 28-Feb-2026
-- 详细格式选项
SELECT 
    DATE_FORMAT(NOW(), '%Y'),        -- 2026(四位年份)
    DATE_FORMAT(NOW(), '%y'),        -- 26(两位年份)
    DATE_FORMAT(NOW(), '%M'),        -- February(月份全称)
    DATE_FORMAT(NOW(), '%b'),        -- Feb(月份简称)
    DATE_FORMAT(NOW(), '%m'),        -- 02(两位月份)
    DATE_FORMAT(NOW(), '%c'),        -- 2(月份,不带前导零)
    DATE_FORMAT(NOW(), '%d'),        -- 28(两位日期)
    DATE_FORMAT(NOW(), '%e'),        -- 28(日期,不带前导零)
    DATE_FORMAT(NOW(), '%H'),        -- 14(24小时制,两位)
    DATE_FORMAT(NOW(), '%h'),        -- 02(12小时制,两位)
    DATE_FORMAT(NOW(), '%I'),        -- 02(12小时制,两位)
    DATE_FORMAT(NOW(), '%k'),        -- 14(24小时制,不带前导零)
    DATE_FORMAT(NOW(), '%l'),        -- 2(12小时制,不带前导零)
    DATE_FORMAT(NOW(), '%i'),        -- 30(两位分钟)
    DATE_FORMAT(NOW(), '%s'),        -- 45(两位秒)
    DATE_FORMAT(NOW(), '%p'),        -- PM(AM/PM)
    DATE_FORMAT(NOW(), '%W'),        -- Saturday(星期全称)
    DATE_FORMAT(NOW(), '%a'),        -- Sat(星期简称)
    DATE_FORMAT(NOW(), '%w'),        -- 6(星期,0=周日,6=周六)
    DATE_FORMAT(NOW(), '%j'),        -- 059(一年中的第几天)
    DATE_FORMAT(NOW(), '%U'),        -- 09(周,周日开始)
    DATE_FORMAT(NOW(), '%u'),        -- 09(周,周一开始)
    DATE_FORMAT(NOW(), '%T'),        -- 14:30:45(24小时时间)
    DATE_FORMAT(NOW(), '%r');        -- 02:30:45 PM(12小时时间)

2. 日期解析(STR_TO_DATE)

-- 字符串转日期
SELECT STR_TO_DATE('28/02/2026', '%d/%m/%Y');      -- 2026-02-28
SELECT STR_TO_DATE('2026-Feb-28', '%Y-%b-%d');     -- 2026-02-28
SELECT STR_TO_DATE('02/28/2026 14:30', '%m/%d/%Y %H:%i'); -- 2026-02-28 14:30:00
SELECT STR_TO_DATE('Saturday, February 28, 2026', '%W, %M %d, %Y'); -- 2026-02-28

3. 时间格式化(TIME_FORMAT)

SELECT TIME_FORMAT('14:30:45', '%H:%i:%s');  -- 14:30:45
SELECT TIME_FORMAT('14:30:45', '%h:%i %p');  -- 02:30 PM

四、日期计算和运算

1. 日期加减(DATE_ADD / DATE_SUB)

-- 日期加法
SELECT DATE_ADD('2026-02-28', INTERVAL 1 DAY);      -- 2026-03-01
SELECT DATE_ADD('2026-02-28 14:30:45', INTERVAL 1 HOUR); -- 2026-02-28 15:30:45
SELECT DATE_ADD('2026-02-28', INTERVAL 1 MONTH);    -- 2026-03-28
SELECT DATE_ADD('2026-02-28', INTERVAL 1 YEAR);     -- 2027-02-28
SELECT DATE_ADD('2026-02-28', INTERVAL '1:30' HOUR_MINUTE); -- 2026-02-28 15:30:00
-- 日期减法
SELECT DATE_SUB('2026-02-28', INTERVAL 1 DAY);      -- 2026-02-27
SELECT DATE_SUB('2026-02-28 14:30:45', INTERVAL 30 MINUTE); -- 2026-02-28 14:00:45
-- 简化写法
SELECT '2026-02-28' + INTERVAL 1 DAY;      -- 2026-03-01
SELECT '2026-02-28' - INTERVAL 1 WEEK;     -- 2026-02-21

2. 时间间隔类型

-- 支持的时间间隔单位
SELECT NOW() + INTERVAL 1 SECOND;   -- 加1秒
SELECT NOW() + INTERVAL 1 MINUTE;   -- 加1分钟
SELECT NOW() + INTERVAL 1 HOUR;     -- 加1小时
SELECT NOW() + INTERVAL 1 DAY;      -- 加1天
SELECT NOW() + INTERVAL 1 WEEK;     -- 加1周
SELECT NOW() + INTERVAL 1 MONTH;    -- 加1月
SELECT NOW() + INTERVAL 1 QUARTER;  -- 加1季度
SELECT NOW() + INTERVAL 1 YEAR;     -- 加1年
-- 组合间隔
SELECT NOW() + INTERVAL '1 2:30:45' DAY_SECOND;     -- 加1天2小时30分45秒
SELECT NOW() + INTERVAL '1-2' YEAR_MONTH;           -- 加1年2个月
SELECT NOW() + INTERVAL '10:30' MINUTE_SECOND;      -- 加10分30秒

3. 日期差计算

-- 日期差(天数)
SELECT DATEDIFF('2026-02-28', '2026-02-20');        -- 8(天数差)
SELECT DATEDIFF('2026-02-20', '2026-02-28');        -- -8
-- 时间差(时间部分)
SELECT TIMEDIFF('14:30:45', '10:15:20');            -- 04:15:25
SELECT TIMEDIFF('2026-02-28 14:30:45', '2026-02-28 10:15:20'); -- 04:15:25
-- 时间戳差(秒数)
SELECT TIMESTAMPDIFF(SECOND, '2026-02-28 10:00:00', '2026-02-28 14:30:45'); -- 16245
SELECT TIMESTAMPDIFF(MINUTE, '2026-02-28 10:00:00', '2026-02-28 14:30:45'); -- 270
SELECT TIMESTAMPDIFF(HOUR, '2026-02-28 10:00:00', '2026-02-28 14:30:45');   -- 4
SELECT TIMESTAMPDIFF(DAY, '2026-02-20', '2026-02-28');                      -- 8
SELECT TIMESTAMPDIFF(MONTH, '2026-01-15', '2026-03-15');                    -- 2
SELECT TIMESTAMPDIFF(YEAR, '2024-02-28', '2026-02-28');                     -- 2

五、日期生成和构造

1. 生成日期

-- 构造日期
SELECT MAKEDATE(2026, 59);          -- 2026-02-28(2026年第59天)
SELECT MAKETIME(14, 30, 45);        -- 14:30:45
-- 从部分构造日期
SELECT STR_TO_DATE('2026,59', '%Y,%j');  -- 2026-02-28(年份 + 一年中的第几天)

2. 获取特定日期

-- 获取月份最后一天
SELECT LAST_DAY('2026-02-15');      -- 2026-02-28
SELECT LAST_DAY('2026-01-15');      -- 2026-01-31
SELECT LAST_DAY('2026-02-28');      -- 2026-02-28
-- 获取月份第一天
SELECT DATE_FORMAT('2026-02-28', '%Y-%m-01');  -- 2026-02-01
SELECT DATE_SUB('2026-02-28', INTERVAL DAYOFMONTH('2026-02-28')-1 DAY); -- 2026-02-01
-- 获取周的开始/结束
SELECT DATE_ADD('2026-02-28', INTERVAL -WEEKDAY('2026-02-28') DAY);  -- 本周一
SELECT DATE_ADD('2026-02-28', INTERVAL 6-WEEKDAY('2026-02-28') DAY); -- 本周日

六、日期验证和调整

1. 日期验证

-- 检查日期有效性
SELECT ISDATE('2026-02-28');        -- 1(有效)
SELECT ISDATE('2026-13-45');        -- 0(无效)
SELECT ISDATE('2026-02-29');        -- 0(2026年不是闰年)
-- 闰年检查(间接方式)
SELECT DAY(LAST_DAY('2026-02-01')); -- 28(2026年2月有28天)
SELECT DAY(LAST_DAY('2024-02-01')); -- 29(2024年2月有29天)

2. 日期调整

-- 调整到指定日期部分
SELECT DATE('2026-02-28 14:30:45');       -- 2026-02-28
SELECT TIME('2026-02-28 14:30:45');       -- 14:30:45
-- 提取并调整
SELECT EXTRACT(YEAR FROM '2026-02-28');   -- 2026
SELECT EXTRACT(YEAR_MONTH FROM '2026-02-28'); -- 202602
SELECT EXTRACT(DAY_HOUR FROM '2026-02-28 14:30:45'); -- 2814

七、日期和时间戳转换

1. UNIX时间戳转换

-- 时间转时间戳
SELECT UNIX_TIMESTAMP('2026-02-28 14:30:45');  -- 1772303445
SELECT UNIX_TIMESTAMP();                       -- 当前时间戳
-- 时间戳转时间
SELECT FROM_UNIXTIME(1772303445);              -- 2026-02-28 14:30:45
SELECT FROM_UNIXTIME(1772303445, '%Y-%m-%d %H:%i:%s'); -- 2026-02-28 14:30:45
-- 时间戳格式化
SELECT DATE_FORMAT(FROM_UNIXTIME(1772303445), '%Y-%m-%d'); -- 2026-02-28

2. 其他时间单位转换

-- 秒数转时间
SELECT SEC_TO_TIME(3661);           -- 01:01:01
SELECT TIME_TO_SEC('01:01:01');     -- 3661
-- 天数转换
SELECT TO_DAYS('2026-02-28');       -- 738885(从公元0年开始的天数)
SELECT FROM_DAYS(738885);           -- 2026-02-28

八、实用查询示例

1. 查询最近N天的数据

-- 最近7天
SELECT * FROM orders 
WHERE order_date >= CURDATE() - INTERVAL 7 DAY;
-- 最近30天
SELECT * FROM logs 
WHERE log_time >= DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 本月数据
SELECT * FROM sales 
WHERE YEAR(sale_date) = YEAR(CURDATE()) 
  AND MONTH(sale_date) = MONTH(CURDATE());

2. 统计查询

-- 按天统计
SELECT DATE(create_time) as date, COUNT(*) as count
FROM users
WHERE create_time >= CURDATE() - INTERVAL 30 DAY
GROUP BY DATE(create_time)
ORDER BY date DESC;
-- 按小时统计
SELECT HOUR(create_time) as hour, COUNT(*) as count
FROM logs
WHERE DATE(create_time) = CURDATE()
GROUP BY HOUR(create_time)
ORDER BY hour;

3. 日期范围查询

-- 今天的数据
SELECT * FROM activities 
WHERE DATE(activity_time) = CURDATE();
-- 昨天的数据
SELECT * FROM activities 
WHERE DATE(activity_time) = CURDATE() - INTERVAL 1 DAY;
-- 本周数据(周一开始)
SELECT * FROM activities 
WHERE YEARWEEK(activity_time) = YEARWEEK(CURDATE());
-- 本月数据
SELECT * FROM activities 
WHERE YEAR(activity_time) = YEAR(CURDATE()) 
  AND MONTH(activity_time) = MONTH(CURDATE());

4. 时间计算

-- 计算年龄
SELECT 
    birth_date,
    TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) as age
FROM users;
-- 计算工作时长(分钟)
SELECT 
    start_time,
    end_time,
    TIMESTAMPDIFF(MINUTE, start_time, end_time) as duration_minutes
FROM work_sessions;
-- 计算剩余天数
SELECT 
    DATEDIFF(deadline, CURDATE()) as days_remaining
FROM projects;

九、性能优化建议

-- ❌ 不推荐:使用函数导致索引失效
SELECT * FROM orders 
WHERE DATE(order_time) = '2026-02-28';
-- ✅ 推荐:使用范围查询可以利用索引
SELECT * FROM orders 
WHERE order_time >= '2026-02-28 00:00:00' 
  AND order_time < '2026-02-29 00:00:00';
-- ❌ 不推荐:在WHERE子句中使用函数
SELECT * FROM users 
WHERE YEAR(create_time) = 2026 
  AND MONTH(create_time) = 2;
-- ✅ 推荐:使用范围查询
SELECT * FROM users 
WHERE create_time >= '2026-02-01' 
  AND create_time < '2026-03-01';

十、MySQL 8.0 新增函数

-- MySQL 8.0+ 新增函数
SELECT DATE('2026-02-28 14:30:45');  -- 已存在
SELECT TIME('2026-02-28 14:30:45');  -- 已存在
-- 时区转换(8.0+)
SELECT CONVERT_TZ('2026-02-28 14:30:45', '+00:00', '+08:00');
-- 提取时间部分(8.0+)
SELECT EXTRACT(YEAR FROM '2026-02-28');     -- 2026
SELECT EXTRACT(MONTH FROM '2026-02-28');    -- 2
SELECT EXTRACT(DAY FROM '2026-02-28');      -- 28
-- 获取系统时区(8.0+)
SELECT @@system_time_zone;

总结表格

函数类别

常用函数

用途说明

获取当前​

NOW(), CURDATE(), CURTIME()

获取当前日期时间

日期提取​

YEAR(), MONTH(), DAY()

提取日期各部分

日期计算​

DATE_ADD(), DATE_SUB(), DATEDIFF()

日期加减和计算

日期格式化​

DATE_FORMAT(), STR_TO_DATE()

日期格式转换

特殊日期​

LAST_DAY(), MAKEDATE()

生成特定日期

时间戳​

UNIX_TIMESTAMP(), FROM_UNIXTIME()

UNIX时间戳转换

时间差​

TIMESTAMPDIFF(), TIMEDIFF()

计算时间差

使用建议:

到此这篇关于MySQL 日期和时间函数示例详解的文章就介绍到这了,更多相关mysql日期和时间函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文