目錄
時間是數據的一種類型
🧰 MySQL 常用時間函數大全
🟦 1. 獲取當前時間/日期
🟦 2. 日期運算(加減)
🟦 3. 時間差計算
🟦 4. 格式化日期
🟦 5. 提取時間部分
🟦 6. 時間戳相關?
?函數之間的聯系
時間是數據的一種類型
我們用 MySQL 存儲時間,其實和存儲數字、字符串一樣,時間是 一類特殊的數據類型(DATE
/ DATETIME
/ TIMESTAMP
)。
所以我們要處理它,比如:
-
現在是什么時間?(取值)
-
某個時間加上 3 天是多少?(運算)
-
兩個時間差多少?(對比)
-
顯示成“年-月-日”?(格式化)
于是我們需要一類“時間函數工具箱”來完成這些任務。
🧰 MySQL 常用時間函數大全
🟦 1. 獲取當前時間/日期
函數名 | 中文含義 | 示例 | 返回 |
---|---|---|---|
NOW() | 當前日期和時間 | SELECT NOW(); | 2025-05-08 20:21:00 |
CURDATE() | 當前日期(不包括時間) | SELECT CURDATE(); | 2025-05-08 |
CURTIME() | 當前時間(不包括日期) | SELECT CURTIME(); | 20:21:00 |
適用場景:記錄操作時間、篩選“今天”的數據、判斷是否超期。
🟦 2. 日期運算(加減)
函數名 | 中文含義 | 示例 | 返回 |
---|---|---|---|
DATE_ADD(d, INTERVAL n unit) | 某日期加上時間間隔 | DATE_ADD('2024-01-01', INTERVAL 3 DAY) | 2024-01-04 |
DATE_SUB(d, INTERVAL n unit) | 某日期減去時間間隔 | DATE_SUB('2024-01-10', INTERVAL 1 MONTH) | 2023-12-10 |
-
unit
可以是DAY
,MONTH
,YEAR
,HOUR
,MINUTE
等。
適用場景:查“過去 7 天”/“近 1 個月”的記錄。
DATE_ADD(date, INTERVAL expr unit)
-
功能:給日期加上指定的時間間隔。
-
語法:
SELECT DATE_ADD('2025-05-13', INTERVAL 10 DAY); -- 加10天
DATE_SUB(date, INTERVAL expr unit)
-
功能:從日期中減去時間間隔。
-
語法:
SELECT DATE_SUB('2025-05-13', INTERVAL 1 MONTH); -- 減1個月
🟦 3. 時間差計算
函數名 | 中文含義 | 示例 | 返回 |
---|---|---|---|
DATEDIFF(d1, d2) | d1 - d2 相差多少天(整數) | DATEDIFF('2025-05-10', '2025-05-01') | 9 |
TIMESTAMPDIFF(unit, d1, d2) | 相差多少單位(更靈活) | TIMESTAMPDIFF(MONTH, '2023-01-01', '2025-05-01') | 28 |
-
unit
也可以是SECOND
,MINUTE
,HOUR
,DAY
,MONTH
,YEAR
適用場景:計算會員時長、距離到期還有幾天、是否超時。
DATEDIFF(date1, date2)
-
功能:計算兩個日期之間的天數差值(date1 - date2)。
-
語法:
SELECT DATEDIFF('2025-05-13', '2025-05-01'); -- 返回 12
TIMESTAMPDIFF(unit, datetime1, datetime2)
-
功能:計算兩個時間之間的差值,可指定單位(
SECOND
,MINUTE
,HOUR
,DAY
,MONTH
,YEAR
)。 -
語法:
SELECT TIMESTAMPDIFF(DAY, '2025-05-01', '2025-05-13'); -- 返回 12
🟦 4. 格式化日期
函數名 | 中文含義 | 示例 | 返回 |
---|---|---|---|
DATE_FORMAT(d, format) | 格式化時間 | DATE_FORMAT(NOW(), '%Y-%m-%d') | 2025-05-08 |
適用場景:前端展示、日志格式化、分組查詢(比如按月統計)。
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
?常用格式符號:
符號 | 含義 |
---|---|
%Y | 四位數年份(2025) |
%y | 兩位數年份(25) |
%m | 月份(01–12) |
%d | 日期(01–31) |
%H | 小時(00–23) |
%i | 分鐘(00–59) |
%s | 秒(00–59) |
🟦 5. 提取時間部分
函數名 | 中文含義 | 示例 | 返回 |
---|---|---|---|
YEAR(d) | 提取年份 | YEAR(NOW()) | 2025 |
MONTH(d) | 提取月份 | MONTH('2024-08-15') | 8 |
DAY(d) | 提取日期 | DAY('2025-05-08') | 8 |
HOUR(d) | 小時 | HOUR('20:15:00') | 20 |
適用場景:按年月日分組、按小時分布分析。?
YEAR(date)
-
功能:提取年份。
-
語法:
SELECT YEAR('2025-05-13'); -- 返回 2025
DAY(date)
或 DAYOFMONTH(date)
-
功能:提取日期中的“日”部分。
-
語法:
SELECT DAY('2025-05-13'); -- 返回 13
HOUR(time)
/ MINUTE(time)
/ SECOND(time)
-
功能:提取時間的時、分、秒。
-
示例:
SELECT HOUR('14:32:10'); -- 返回 14
SELECT MINUTE('14:32:10'); -- 返回 32
SELECT SECOND('14:32:10'); -- 返回 10
🟦 6. 時間戳相關?
時間戳(Timestamp)是指從一個特定的起點時間開始所經過的總秒數,通常用于表示某個時刻。它是計算機中一種常見的時間表示方式,可以精確、方便地進行時間計算和排序。?
-
Unix時間戳(Unix Timestamp):是自1970年1月1日 00:00:00 UTC以來所經過的總秒數。
-
它是一個整數(精確到秒),例如:
1715601130
表示的是 2025年5月13日 13:32:10(UTC) 左右。?
時間戳的特點
特性 | 描述 |
---|---|
精度高 | 精確到秒(也可毫秒、微秒) |
易于比較 | 時間戳是整數,直接比較大小即可判斷前后 |
跨平臺通用 | 適用于大多數編程語言和數據庫 |
不含時區信息 | 默認以UTC計算,需要轉換為本地時間 |
UNIX_TIMESTAMP()
-
功能:獲取當前時間的 Unix 時間戳(單位:秒)
-
示例:
SELECT UNIX_TIMESTAMP();
-- 返回:1715601130
FROM_UNIXTIME(timestamp)
-
功能:將 Unix 時間戳轉為可讀的日期時間
-
示例:
SELECT FROM_UNIXTIME(1715601130);
-- 返回:2025-05-13 13:32:10
UNIX_TIMESTAMP(date)
-
功能:將一個標準時間轉為 Unix 時間戳
-
示例:
SELECT UNIX_TIMESTAMP('2025-05-13 13:32:10');
-- 返回:1715601130
?
?函數之間的聯系
可以把它們看成一個工具鏈:
[當前時間] [日期格式化]NOW() CURDATE() ───> DATE_FORMAT()↓ ↑DATE_ADD() TIMESTAMPDIFF()DATE_SUB() DATEDIFF()↓ ↑生成目標時間 計算時間差↓ ↑YEAR(), MONTH(), DAY() ←────提取某部分
示例:
-- 查詢本月注冊的用戶
SELECT * FROM users
WHERE DATE_FORMAT(created_at, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m');-- 計算某訂單創建以來已過天數
SELECT DATEDIFF(NOW(), order_created_at) AS days_elapsed
FROM orders;-- 添加30天后的到期時間
SELECT DATE_ADD(created_at, INTERVAL 30 DAY) AS expiry_date
FROM users;