MySQL 中從 DATETIME 或 TIMESTAMP 欄位擷取年份、月份、日期,最靈活的方式是使用 DATE_FORMAT() 函數。本文提供常用格式化範例與效能提醒。
DATE_FORMAT(date_column, format_string)
| 符號 | 含義 | 範例輸出 |
|---|---|---|
%Y | 四位數年份 | 2024 |
%y | 兩位數年份 | 24 |
%m | 月份(01-12) | 01 |
%c | 月份(1-12) | 1 |
%d | 日期(01-31) | 05 |
%e | 日期(1-31) | 5 |
%H | 小時(00-23) | 14 |
%i | 分鐘(00-59) | 30 |
%s | 秒數(00-59) | 45 |
SELECT DATE_FORMAT(produceDate, '%Y') AS yr
FROM historybarcodesort
WHERE DATE_FORMAT(produceDate, '%Y') = '2013';
結果:2013
SELECT DATE_FORMAT(create_time, '%Y-%m-%d') AS date_only FROM orders;
SELECT DATE_FORMAT(order_time, '%Y-%m') AS ym, COUNT(*) AS cnt
FROM orders
GROUP BY ym
ORDER BY ym DESC;
WHERE DATE_FORMAT(col, '%Y') = '2023'),會導致無法使用索引(全表掃描)。-- 推薦:可用索引
WHERE produceDate >= '2013-01-01' AND produceDate < '2014-01-01'
-- 或 MySQL 8.0+ 功能性索引
ALTER TABLE t ADD INDEX idx_year ((YEAR(produceDate)));
SELECT 顯示格式化無效能影響,僅影響回傳資料格式。YEAR(date)、MONTH(date)、DAY(date):直接回傳數值,適合運算/分組,同樣會阻礙索引。EXTRACT(YEAR FROM date):標準 SQL 寫法。掌握 DATE_FORMAT 靈活格式化,搭配正確範圍查詢保護索引,是 MySQL 日期處理的核心功夫。