mysql 日期匹配與隨機(jī)月份查詢(xún)難題
查詢(xún)從指定月份到現(xiàn)在的時(shí)間段內(nèi),并隨機(jī)選擇某個(gè)月份的數(shù)據(jù),卻遇到了數(shù)據(jù)錯(cuò)亂的問(wèn)題。這可能是因?yàn)樵?sql 中的 rand() 函數(shù)在每次 where 條件中執(zhí)行,導(dǎo)致日期范圍不斷變化。
解決方案
為了解決這個(gè)問(wèn)題,可以使用 mysql 8 中的 with 語(yǔ)句:
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')
登錄后復(fù)制
優(yōu)化建議
雖然 with 語(yǔ)句解決了問(wèn)題,但還有以下優(yōu)化建議:
- 在代碼中直接生成隨機(jī)日期范圍,避免多次執(zhí)行 rand() 函數(shù)。
- 使用 between 或大于等于/小于查詢(xún)條件,避免使用 date_format() 函數(shù),以利用索引。
- 為 create_time 列創(chuàng)建索引,以提高查詢(xún)效率。
例如,可以使用以下優(yōu)化后的 sql:
SELECT * FROM teacher WHERE create_time BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59';
登錄后復(fù)制