需求:統計 UserBox 表中 endDate(DATETIME 型別)年月與系統當前年月相符的記錄總數,即「本月到期保管箱數量」。
SELECT COUNT(*) AS count FROM UserBox WHERE endDate = "yyyy-MM";
此寫法有三個關鍵錯誤:
endDate 是 DATETIME,無法直接與字串 "yyyy-MM" 比較SELECT COUNT(*) AS count
FROM UserBox
WHERE DATE_FORMAT(endDate, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m');
SELECT COUNT(*) AS count
FROM UserBox
WHERE YEAR(endDate) = YEAR(NOW()) AND MONTH(endDate) = MONTH(NOW());
SELECT COUNT(*) AS count
FROM UserBox
WHERE endDate >= DATE_FORMAT(NOW(), '%Y-%m-01')
AND endDate < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH);
endDate 有索引,方法三可走索引範圍掃描,效能最佳TO_CHAR(Oracle 語法),MySQL 對應的是 DATE_FORMAT核心原則:日期比對要提取相同粒度(年月),且優先考慮能利用索引的寫法。