首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MySQL 查詢當月到期資料:正確使用 DATE_FORMAT 比對年月

     編輯:程式設計疑難解答

需求:統計 UserBox 表中 endDate(DATETIME 型別)年月與系統當前年月相符的記錄總數,即「本月到期保管箱數量」。

錯誤寫法分析

SELECT COUNT(*) AS count FROM UserBox WHERE endDate = "yyyy-MM";

此寫法有三個關鍵錯誤:

  • endDate 是 DATETIME,無法直接與字串 "yyyy-MM" 比較
  • "yyyy-MM" 不是合法日期字面值,MySQL 會嘗試隱式轉換導致全表掃描且結果為 0
  • 缺少年月提取函數,無法實現「同年同月」的語義比對

正確解法

方法一:使用 DATE_FORMAT(推薦,可讀性佳)

SELECT COUNT(*) AS count
FROM UserBox
WHERE DATE_FORMAT(endDate, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m');

方法二:使用 YEAR() + MONTH() 函數(效能稍優)

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

核心原則:日期比對要提取相同粒度(年月),且優先考慮能利用索引的寫法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved