你的SQL查詢 `
select *<br>FROM teacher<br>WHERE DATE_FORMAT(DATE_ADD('2023-11-01', INTERVAL FLOOR(RAND() * datediff(CURDATE(), '2023-11-01')) DAY), '%Y-%m') = DATE_FORMAT(create_time, '%Y-%m');
登錄后復制
` 意圖從給定月份到現在的時間段內隨機查詢某個月的數據,但返回的結果卻有出入。
問題根源
問題在于sql語句中的RAND()函數。它在每一次WHERE查詢時都會重新執行,導致隨機日期范圍每次都不同。這樣一來,查詢結果就難以預測。
解決方案
解決這個問題的方法是在MySQL 8中使用WITH語句,將RAND()函數的執行限制為一次。修改后的SQL語句如下:
`
WITH mo1 AS (<br> SELECT DATE_FORMAT(DATE_ADD('2023-11-01', INTERVAL FLOOR(RAND() * DATEDIFF(CURDATE(), '2023-11-01')) DAY), '%Y-%m') AS month<br>)<br>SELECT *<br>FROM teacher<br>JOIN mo1 ON mo1.month = DATE_FORMAT(create_time, '%Y-%m');<br>
登錄后復制
`
優化建議
雖然這種方法可以解決問題,但仍有改進的空間:
- 將動態生成的日期范圍作為參數傳入SQL語句,而不是直接寫在SQL語句中,這可以提高代碼的可讀性和可維護性。
- 避免使用DATE_FORMAT()函數對查詢列進行格式化,因為它會影響MySQL使用索引的能力。轉而使用外部傳入的參數對日期進行格式化或直接使用BETWEEN查詢會提高查詢效率。