首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 日期時間函數完整速查手冊:從基礎到進階應用

     編輯:MySQL 資料庫相關知識

核心函數分類總覽

類別函數說明範例輸出
日期提取DAYOFWEEK(date)星期索引 (1=週日...7=週六)SELECT DAYOFWEEK('2024-01-15') → 2
WEEKDAY(date)星期索引 (0=週一...6=週日)SELECT WEEKDAY('2024-01-15') → 0
DAYOFMONTH(date)月份中的日期 (1-31)SELECT DAYOFMONTH('2024-01-15') → 15
DAYOFYEAR(date)年份中的天數 (1-366)SELECT DAYOFYEAR('2024-01-15') → 15
MONTH(date)月份 (1-12)SELECT MONTH('2024-01-15') → 1
DAYNAME(date)星期名稱SELECT DAYNAME('2024-01-15') → 'Monday'
MONTHNAME(date)月份名稱SELECT MONTHNAME('2024-01-15') → 'January'
QUARTER(date)季度 (1-4)SELECT QUARTER('2024-01-15') → 1
週年計算WEEK(date[, mode])週數,mode=0 週日開始,1 週一開始SELECT WEEK('2024-01-15',1) → 3
YEAR(date)年份 (1000-9999)SELECT YEAR('2024-01-15') → 2024
YEARWEEK(date[, mode])年份+週數組合SELECT YEARWEEK('2024-01-15',1) → 202403
WEEKOFYEAR(date)ISO 8601 週數 (1-53)SELECT WEEKOFYEAR('2024-01-15') → 3
時間提取HOUR(time)小時 (0-23)SELECT HOUR('14:30:45') → 14
MINUTE(time)分鐘 (0-59)SELECT MINUTE('14:30:45') → 30
SECOND(time)秒 (0-59)SELECT SECOND('14:30:45') → 45
日期運算DATE_ADD(date, INTERVAL expr unit)日期加法SELECT DATE_ADD('2024-01-15', INTERVAL 10 DAY) → '2024-01-25'
DATE_SUB(date, INTERVAL expr unit)日期減法SELECT DATE_SUB('2024-01-15', INTERVAL 2 MONTH) → '2023-11-15'
DATEDIFF(date1, date2)兩日期天數差SELECT DATEDIFF('2024-01-15','2024-01-01') → 14
TIMESTAMPDIFF(unit, dt1, dt2)精確時間差(支援 MICROSECOND)SELECT TIMESTAMPDIFF(SECOND, '2024-01-15 10:00', '2024-01-15 10:01') → 60
PERIOD_ADD(P, N)年月格式 YYYYMM 加 N 月SELECT PERIOD_ADD(202401, 3) → 202404
PERIOD_DIFF(P1, P2)兩年月期間月份差SELECT PERIOD_DIFF(202404, 202401) → 3
格式化轉換DATE_FORMAT(date, format)自訂日期格式輸出SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') → '2024-01-15 14:30:45'
TIME_FORMAT(time, format)自訂時間格式輸出SELECT TIME_FORMAT('14:30:45', '%h:%i %p') → '02:30 PM'
STR_TO_DATE(str, format)字串解析為日期SELECT STR_TO_DATE('15/01/2024', '%d/%m/%Y') → '2024-01-15'
GET_FORMAT(type, locale)獲取標準格式字串SELECT GET_FORMAT(DATE, 'ISO') → '%Y-%m-%d'
當前時間NOW() / SYSDATE()當前日期時間 (NOW 為語句開始時間)SELECT NOW() → '2024-01-15 14:30:45'
CURDATE() / CURRENT_DATE()當前日期SELECT CURDATE() → '2024-01-15'
CURTIME() / CURRENT_TIME()當前時間SELECT CURTIME() → '14:30:45'

實戰場景範例

1. 近 30 天資料查詢(索引友善寫法)

-- ✅ 佳:利用索引範圍掃描
SELECT * FROM orders
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
  AND created_at < CURDATE() + INTERVAL 1 DAY;

-- ❌ 差:函數包裹欄位導致全表掃描
SELECT * FROM orders
WHERE DATEDIFF(CURDATE(), created_at) <= 30;

2. 本週/本月/本季報表統計

-- 本週一至週日
WHERE YEARWEEK(created_at, 1) = YEARWEEK(CURDATE(), 1)

-- 本月
WHERE DATE_FORMAT(created_at, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')

-- 本季
WHERE QUARTER(created_at) = QUARTER(CURDATE())
  AND YEAR(created_at) = YEAR(CURDATE())

3. 年齡/工齡精確計算

SELECT 
  FLOOR(DATEDIFF(CURDATE(), birth_date) / 365.25) AS age,
  TIMESTAMPDIFF(YEAR, hire_date, CURDATE()) AS years_of_service
FROM employees;

4. 時區轉換與夏令時間處理

-- 會話級設定時區
SET time_zone = '+08:00';  -- 或 'Asia/Taipei'

-- 轉換 UTC 存儲時間至本地顯示
SELECT CONVERT_TZ(utc_created, '+00:00', '+08:00') AS local_created
FROM logs;

效能優化關鍵點

  • 避免在 WHERE 條件中對欄位使用函數,改寫為範圍查詢以利用索引
  • 批次插入時間資料時,優先使用 TIMESTAMP(4 bytes)而非 DATETIME(8 bytes)
  • 分區表按時間維度分區(RANGE COLUMNS(created_at)),配合 PARTITION BY RANGE 實現歷史資料快速歸檔
  • 使用 TIMESTAMPDIFF 替代 DATEDIFF 以獲得微秒級精度並支援更多時間單位

常見陷阱提醒

  1. WEEK() 的 mode 參數影響週起始日與歸屬年份,跨年週務必指定 mode=3(ISO 模式)
  2. NOW() 在儲存函數/觸發器中返回語句開始時間,SYSDATE() 返回實際執行時間,複製延遲場景下差異巨大
  3. DATE_FORMAT 格式字串區分大小寫:%m 月份、%M 月份名稱、%i 分鐘、%H 24制小時、%h 12制小時
  4. 舊版本 YEAR(2位數) 自動補全規則:00-69 → 2000-2069,70-99 → 1970-1999,建議一律使用 4 位數年份
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved