MySQL 日期和時(shí)間函數(shù)示例詳解
一、獲取當(dāng)前日期和時(shí)間
1. 獲取當(dāng)前日期和時(shí)間
-- 當(dāng)前完整日期時(shí)間 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 -- 細(xì)微區(qū)別 SELECT NOW(), SLEEP(2), NOW(); -- 兩個(gè)NOW()值相同 SELECT SYSDATE(), SLEEP(2), SYSDATE(); -- SYSDATE()值不同
2. 獲取當(dāng)前日期(無(wú)時(shí)間)
SELECT CURDATE(); -- 2026-02-28 SELECT CURRENT_DATE(); -- 2026-02-28 SELECT CURRENT_DATE; -- 2026-02-28 SELECT DATE(NOW()); -- 2026-02-28
3. 獲取當(dāng)前時(shí)間(無(wú)日期)
SELECT CURTIME(); -- 14:30:45 SELECT CURRENT_TIME(); -- 14:30:45 SELECT CURRENT_TIME; -- 14:30:45 SELECT TIME(NOW()); -- 14:30:45
二、日期提取函數(shù)
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(一年中的第幾天)
-- 提取小時(shí)、分鐘、秒
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'); -- 1234562. 日期部分組合提取
-- 提取日期時(shí)間
SELECT DATE('2026-02-28 14:30:45'); -- 2026-02-28
SELECT TIME('2026-02-28 14:30:45'); -- 14:30:45
-- 提取UNIX時(shí)間戳
SELECT UNIX_TIMESTAMP('2026-02-28 14:30:45'); -- 1772303445
SELECT UNIX_TIMESTAMP(); -- 當(dāng)前時(shí)間戳三、日期格式化和解析
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
-- 詳細(xì)格式選項(xiàng)
SELECT
DATE_FORMAT(NOW(), '%Y'), -- 2026(四位年份)
DATE_FORMAT(NOW(), '%y'), -- 26(兩位年份)
DATE_FORMAT(NOW(), '%M'), -- February(月份全稱)
DATE_FORMAT(NOW(), '%b'), -- Feb(月份簡(jiǎn)稱)
DATE_FORMAT(NOW(), '%m'), -- 02(兩位月份)
DATE_FORMAT(NOW(), '%c'), -- 2(月份,不帶前導(dǎo)零)
DATE_FORMAT(NOW(), '%d'), -- 28(兩位日期)
DATE_FORMAT(NOW(), '%e'), -- 28(日期,不帶前導(dǎo)零)
DATE_FORMAT(NOW(), '%H'), -- 14(24小時(shí)制,兩位)
DATE_FORMAT(NOW(), '%h'), -- 02(12小時(shí)制,兩位)
DATE_FORMAT(NOW(), '%I'), -- 02(12小時(shí)制,兩位)
DATE_FORMAT(NOW(), '%k'), -- 14(24小時(shí)制,不帶前導(dǎo)零)
DATE_FORMAT(NOW(), '%l'), -- 2(12小時(shí)制,不帶前導(dǎo)零)
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(星期簡(jiǎn)稱)
DATE_FORMAT(NOW(), '%w'), -- 6(星期,0=周日,6=周六)
DATE_FORMAT(NOW(), '%j'), -- 059(一年中的第幾天)
DATE_FORMAT(NOW(), '%U'), -- 09(周,周日開(kāi)始)
DATE_FORMAT(NOW(), '%u'), -- 09(周,周一開(kāi)始)
DATE_FORMAT(NOW(), '%T'), -- 14:30:45(24小時(shí)時(shí)間)
DATE_FORMAT(NOW(), '%r'); -- 02:30:45 PM(12小時(shí)時(shí)間)2. 日期解析(STR_TO_DATE)
-- 字符串轉(zhuǎn)日期
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-283. 時(shí)間格式化(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四、日期計(jì)算和運(yùn)算
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
-- 簡(jiǎn)化寫法
SELECT '2026-02-28' + INTERVAL 1 DAY; -- 2026-03-01
SELECT '2026-02-28' - INTERVAL 1 WEEK; -- 2026-02-212. 時(shí)間間隔類型
-- 支持的時(shí)間間隔單位 SELECT NOW() + INTERVAL 1 SECOND; -- 加1秒 SELECT NOW() + INTERVAL 1 MINUTE; -- 加1分鐘 SELECT NOW() + INTERVAL 1 HOUR; -- 加1小時(shí) 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小時(shí)30分45秒 SELECT NOW() + INTERVAL '1-2' YEAR_MONTH; -- 加1年2個(gè)月 SELECT NOW() + INTERVAL '10:30' MINUTE_SECOND; -- 加10分30秒
3. 日期差計(jì)算
-- 日期差(天數(shù))
SELECT DATEDIFF('2026-02-28', '2026-02-20'); -- 8(天數(shù)差)
SELECT DATEDIFF('2026-02-20', '2026-02-28'); -- -8
-- 時(shí)間差(時(shí)間部分)
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
-- 時(shí)間戳差(秒數(shù))
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五、日期生成和構(gòu)造
1. 生成日期
-- 構(gòu)造日期
SELECT MAKEDATE(2026, 59); -- 2026-02-28(2026年第59天)
SELECT MAKETIME(14, 30, 45); -- 14:30:45
-- 從部分構(gòu)造日期
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
-- 獲取周的開(kāi)始/結(jié)束
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); -- 本周日六、日期驗(yàn)證和調(diào)整
1. 日期驗(yàn)證
-- 檢查日期有效性
SELECT ISDATE('2026-02-28'); -- 1(有效)
SELECT ISDATE('2026-13-45'); -- 0(無(wú)效)
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. 日期調(diào)整
-- 調(diào)整到指定日期部分
SELECT DATE('2026-02-28 14:30:45'); -- 2026-02-28
SELECT TIME('2026-02-28 14:30:45'); -- 14:30:45
-- 提取并調(diào)整
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七、日期和時(shí)間戳轉(zhuǎn)換
1. UNIX時(shí)間戳轉(zhuǎn)換
-- 時(shí)間轉(zhuǎn)時(shí)間戳
SELECT UNIX_TIMESTAMP('2026-02-28 14:30:45'); -- 1772303445
SELECT UNIX_TIMESTAMP(); -- 當(dāng)前時(shí)間戳
-- 時(shí)間戳轉(zhuǎn)時(shí)間
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
-- 時(shí)間戳格式化
SELECT DATE_FORMAT(FROM_UNIXTIME(1772303445), '%Y-%m-%d'); -- 2026-02-282. 其他時(shí)間單位轉(zhuǎn)換
-- 秒數(shù)轉(zhuǎn)時(shí)間
SELECT SEC_TO_TIME(3661); -- 01:01:01
SELECT TIME_TO_SEC('01:01:01'); -- 3661
-- 天數(shù)轉(zhuǎn)換
SELECT TO_DAYS('2026-02-28'); -- 738885(從公元0年開(kāi)始的天數(shù))
SELECT FROM_DAYS(738885); -- 2026-02-28八、實(shí)用查詢示例
1. 查詢最近N天的數(shù)據(jù)
-- 最近7天 SELECT * FROM orders WHERE order_date >= CURDATE() - INTERVAL 7 DAY; -- 最近30天 SELECT * FROM logs WHERE log_time >= DATE_SUB(NOW(), INTERVAL 30 DAY); -- 本月數(shù)據(jù) SELECT * FROM sales WHERE YEAR(sale_date) = YEAR(CURDATE()) AND MONTH(sale_date) = MONTH(CURDATE());
2. 統(tǒng)計(jì)查詢
-- 按天統(tǒng)計(jì) 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; -- 按小時(shí)統(tǒng)計(jì) 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. 日期范圍查詢
-- 今天的數(shù)據(jù) SELECT * FROM activities WHERE DATE(activity_time) = CURDATE(); -- 昨天的數(shù)據(jù) SELECT * FROM activities WHERE DATE(activity_time) = CURDATE() - INTERVAL 1 DAY; -- 本周數(shù)據(jù)(周一開(kāi)始) SELECT * FROM activities WHERE YEARWEEK(activity_time) = YEARWEEK(CURDATE()); -- 本月數(shù)據(jù) SELECT * FROM activities WHERE YEAR(activity_time) = YEAR(CURDATE()) AND MONTH(activity_time) = MONTH(CURDATE());
4. 時(shí)間計(jì)算
-- 計(jì)算年齡
SELECT
birth_date,
TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) as age
FROM users;
-- 計(jì)算工作時(shí)長(zhǎng)(分鐘)
SELECT
start_time,
end_time,
TIMESTAMPDIFF(MINUTE, start_time, end_time) as duration_minutes
FROM work_sessions;
-- 計(jì)算剩余天數(shù)
SELECT
DATEDIFF(deadline, CURDATE()) as days_remaining
FROM projects;九、性能優(yōu)化建議
-- ? 不推薦:使用函數(shù)導(dǎo)致索引失效 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子句中使用函數(shù) 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 新增函數(shù)
-- MySQL 8.0+ 新增函數(shù)
SELECT DATE('2026-02-28 14:30:45'); -- 已存在
SELECT TIME('2026-02-28 14:30:45'); -- 已存在
-- 時(shí)區(qū)轉(zhuǎn)換(8.0+)
SELECT CONVERT_TZ('2026-02-28 14:30:45', '+00:00', '+08:00');
-- 提取時(shí)間部分(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
-- 獲取系統(tǒng)時(shí)區(qū)(8.0+)
SELECT @@system_time_zone;總結(jié)表格
函數(shù)類別 | 常用函數(shù) | 用途說(shuō)明 |
|---|---|---|
獲取當(dāng)前? | NOW(), CURDATE(), CURTIME() | 獲取當(dāng)前日期時(shí)間 |
日期提取? | YEAR(), MONTH(), DAY() | 提取日期各部分 |
日期計(jì)算? | DATE_ADD(), DATE_SUB(), DATEDIFF() | 日期加減和計(jì)算 |
日期格式化? | DATE_FORMAT(), STR_TO_DATE() | 日期格式轉(zhuǎn)換 |
特殊日期? | LAST_DAY(), MAKEDATE() | 生成特定日期 |
時(shí)間戳? | UNIX_TIMESTAMP(), FROM_UNIXTIME() | UNIX時(shí)間戳轉(zhuǎn)換 |
時(shí)間差? | TIMESTAMPDIFF(), TIMEDIFF() | 計(jì)算時(shí)間差 |
使用建議:
- 盡量使用原生日期類型存儲(chǔ)日期時(shí)間
- 在WHERE子句中避免對(duì)字段使用函數(shù),以免索引失效
- 根據(jù)業(yè)務(wù)需求選擇合適的日期函數(shù)
- 注意時(shí)區(qū)問(wèn)題,統(tǒng)一使用UTC或業(yè)務(wù)時(shí)區(qū)
- 考慮MySQL版本兼容性
到此這篇關(guān)于MySQL 日期和時(shí)間函數(shù)示例詳解的文章就介紹到這了,更多相關(guān)mysql日期和時(shí)間函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫(kù)如何轉(zhuǎn)移到oracle
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)如何轉(zhuǎn)移到oracle,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù)注意點(diǎn)記錄
有時(shí)候我們需要遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù),那么就需要注意如下問(wèn)題,需要的朋友可以參考下2012-08-08
MySQL進(jìn)行分片合并的實(shí)現(xiàn)步驟
分片合并是指在分布式數(shù)據(jù)庫(kù)系統(tǒng)中,將不同分片上的查詢結(jié)果進(jìn)行整合,以獲得完整的查詢結(jié)果,下面就來(lái)具體介紹一下,感興趣的可以了解一下2025-08-08
mysql復(fù)制data文件遷移的實(shí)現(xiàn)步驟
有時(shí)候,我們需要遷移整個(gè)數(shù)據(jù)庫(kù),包括數(shù)據(jù)文件,本文將介紹如何通過(guò)復(fù)制MySQL的data文件來(lái)完成數(shù)據(jù)庫(kù)遷移,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11

