mysql 日期匹配與隨機月份查詢難題
查詢從指定月份到現在的時間段內,并隨機選擇某個月份的數據,卻遇到了數據錯亂的問題。這可能是因為原始 sql 中的 rand() 函數在每次 where 條件中執行,導致日期范圍不斷變化。
解決方案
為了解決這個問題,可以使用 mysql 8 中的 with 語句:
with mo1 as ( select date_format(date_add('2023-11-01', interval floor(rand() * datediff(curdate(), '2023-11-01')) day), '%y-%m') as month ) select * from teacher join mo1 on mo1.month = date_format(create_time, '%y-%m')
登錄后復制
優化建議
雖然 with 語句解決了問題,但還有以下優化建議:
- 在代碼中直接生成隨機日期范圍,避免多次執行 rand() 函數。
- 使用 between 或大于等于/小于查詢條件,避免使用 date_format() 函數,以利用索引。
- 為 create_time 列創建索引,以提高查詢效率。
例如,可以使用以下優化后的 sql:
SELECT * FROM teacher WHERE create_time BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59';
登錄后復制