MySQL中的timediff、timestampdiff、datediff函數(shù)詳細(xì)對比和說明
前言
這三個函數(shù)都是 MySQL 中常用的日期時間差值計算函數(shù),但用途、參數(shù)和返回值完全不同。以下是詳細(xì)對比和說明。
| 函數(shù)名稱 | 返回值類型 | 功能描述 | 支持的時間單位 | 典型用途 |
|---|---|---|---|---|
| DATEDIFF | INT(天數(shù)) | 計算兩個日期相差的天數(shù)(僅精確到天) | 天(忽略時間部分) | 計算兩個日期之間相隔多少天 |
| TIMEDIFF | TIME 類型 | 計算兩個時間/日期時間的差值,返回時:分:秒格式 | 時、分、秒、微秒 | 計算同一日內(nèi)或跨天的小時級時間差 |
| TIMESTAMPDIFF | INT(指定單位) | 計算兩個日期時間相差的完整單位數(shù)量(最靈活) | YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND, MICROSECOND 等 | 精確計算任意單位的間隔數(shù)量 |
1. DATEDIFF(expr1, expr2)
- 語法:
DATEDIFF(expr1, expr2) - 返回值:expr1 − expr2 的天數(shù)(整數(shù))。時間部分被忽略。
- 計算規(guī)則:expr1 - expr2,正數(shù)表示 expr1 在 expr2 之后。
示例:
SELECT DATEDIFF('2025-12-30', '2025-12-01'); -- 29
SELECT DATEDIFF('2025-12-01', '2025-12-30'); -- -29
SELECT DATEDIFF('2025-12-30 10:00:00', '2025-12-01 23:59:59'); -- 29(時間部分忽略)
適用場景:統(tǒng)計年齡(年份差需結(jié)合其他計算)、會員注冊天數(shù)、訂單間隔天數(shù)等。
2. TIMEDIFF(expr1, expr2)
- 語法:
TIMEDIFF(expr1, expr2) - 返回值:TIME 類型,格式為 ‘HHH:MM:SS’(可超過24小時,如 48:00:00,支持負(fù)值)。
- 限制:
- 兩個參數(shù)都必須是 TIME 或 DATETIME 類型。
- 結(jié)果范圍:-838:59:59 到 838:59:59(約34天多)。
- 如果差值超出范圍,返回 NULL。
示例:
SELECT TIMEDIFF('2025-12-30 15:30:00', '2025-12-30 10:20:30'); -- '05:09:30'
SELECT TIMEDIFF('10:20:30', '15:30:00'); -- '-05:09:30'
SELECT TIMEDIFF('2025-12-31 12:00:00', '2025-12-30 10:00:00'); -- '26:00:00'
適用場景:計算工作時長、打卡上下班時間差、會議持續(xù)時間等需要精確到秒的時間段。
3. TIMESTAMPDIFF(unit, expr1, expr2)
- 語法:
TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2) - 返回值:expr2 − expr1 的指定單位數(shù)量(整數(shù))。
- 注意順序:是 expr2 - expr1(與前兩個函數(shù)順序相反!)。
- 常用 unit 參數(shù)(不區(qū)分大小寫):
- MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR
示例:
SELECT TIMESTAMPDIFF(DAY, '2025-12-01', '2025-12-30'); -- 29 SELECT TIMESTAMPDIFF(MONTH, '2025-10-15', '2025-12-20'); -- 2 SELECT TIMESTAMPDIFF(HOUR, '2025-12-30 10:00:00', '2025-12-31 15:30:00'); -- 29 SELECT TIMESTAMPDIFF(YEAR, '2020-01-01', '2025-12-30'); -- 5 SELECT TIMESTAMPDIFF(MINUTE, '10:00:00', '15:30:45'); -- 330
適用場景:最常用!可以精確計算任意單位的時間差,如用戶年齡(YEAR)、會員時長(MONTH)、響應(yīng)時間(SECOND)等。
三者對比總結(jié)(記憶口訣)
| 需求 | 推薦函數(shù) | 原因 |
|---|---|---|
| 只想知道相差多少天 | DATEDIFF | 最簡單,直接返回天數(shù) |
| 需要返回時:分:秒格式的時間差 | TIMEDIFF | 返回 TIME 類型,適合展示時長 |
| 需要精確到任意單位(年/月/日/時/分/秒) | TIMESTAMPDIFF(首選) | 最靈活,單位可自定義,推薦大多數(shù)場景使用 |
常見誤區(qū)
- 參數(shù)順序不一致:
- DATEDIFF 和 TIMEDIFF 是 expr1 - expr2
- TIMESTAMPDIFF 是 expr2 - expr1(后減前)
- DATEDIFF 忽略時間部分,而 TIMESTAMPDIFF(DAY, …) 會考慮完整時間。
- 計算年齡時不要直接用 DATEDIFF/365(閏年問題),推薦:
TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) - (DATE_FORMAT(CURDATE(), '%m%d') < DATE_FORMAT(birth_date, '%m%d'))
掌握了這三個函數(shù),你就能輕松處理 MySQL 中絕大部分日期時間差計算需求!
總結(jié)
到此這篇關(guān)于MySQL中timediff、timestampdiff、datediff函數(shù)詳細(xì)對比和說明的文章就介紹到這了,更多相關(guān)MySQL timediff、timestampdiff、datediff函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL4 File ‘c:\mysql\share\charsets\?.conf’ not found (Errc
File ‘c:\mysql\share\charsets\?.conf’ not found (Errcode: 22) Character set ‘#33′ is not a compiled character set and is not specified in the ‘c:\mysql\share\charsets\Index’ file2013-08-08
Mysql報錯Duplicate?entry?'值'?for?key?'字段名&
今天在使用數(shù)據(jù)庫的過程中,發(fā)現(xiàn)一直報Duplicate?entry?'值'?for?key?'字段名'的錯誤,所以下面這篇文章主要給大家介紹了關(guān)于Mysql報錯Duplicate?entry?'值'?for?key?'字段名'的解決方法,需要的朋友可以參考下2023-04-04
mySQL中in查詢與exists查詢的區(qū)別小結(jié)
最近被一個朋友問到mySQL中in查詢和exists的區(qū)別,當(dāng)然只是草草的回答了下,今天偶然看到了一篇關(guān)于mysql中的exists查詢的文章,讀完感覺太”冷落”它了,這里總結(jié)一下,也跟自己常用的in查詢做一下對比。有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11
linux 安裝 mysql 8.0.19 詳細(xì)步驟及問題解決方法
這篇文章主要介紹了linux 安裝 mysql 8.0.19 詳細(xì)步驟,本文給大家列出了常見問題及解決方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02

