常用提取函數對比
| 需求 | 函數 | 範例 | 輸出 |
| 年份 | YEAR(date) | YEAR('2023-08-15') | 2023 |
| 月份 | MONTH(date) | MONTH('2023-08-15') | 8 |
| 日期 | DAY(date) / DAYOFMONTH() | DAY('2023-08-15') | 15 |
| 任意格式 | DATE_FORMAT(date, fmt) | DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') | 2023-08-15 14:30:00 |
WHERE 條件中高效用法
-- 查 2013 年記錄(推薦:可用索引)
SELECT * FROM historybarcodesort
WHERE produceDate >= '2013-01-01' AND produceDate < '2014-01-01';
-- 不推薦:函數導致全表掃描
SELECT * FROM historybarcodesort
WHERE YEAR(produceDate) = 2013;
-- DATE_FORMAT 同理失效索引
SELECT DATE_FORMAT(produceDate, '%Y') AS yr
FROM historybarcodesort
WHERE DATE_FORMAT(produceDate, '%Y') = '2013';
格式化符號速查
%Y 四位年份 %y 兩位年份
%m 月份(01-12) %c 月份(1-12)
%d 日期(01-31) %e 日期(1-31)
%H 時(00-23) %h 時(01-12)
%i 分(00-59) %s 秒(00-59)
%W 週名稱 %a 週縮寫
最佳實踐
- 範圍查詢用常量邊界,讓優化器走索引範圍掃描
- 顯示/匯出才用 DATE_FORMAT,不在 WHERE/JOIN/GROUP BY 用
- MySQL 8.0+ 可用
CAST(date AS DATE) 截取日期部分