我想將貓的出生日期作為年份范圍。
年份范圍如下,有多種選擇。
年份 : [2000, 2010, 2020]
如果我選擇 2020 年,則從 2020 年 1 月 1 日到 2029 年 12 月 31 日。
如果我選擇 2000, 2020, 2000-01-01 到 2009-12-31 和 2020-01-01 到 2029-12-31 的時間段。
<TABLE>
CAT {
ID number,
Birth DateTime,
...
}
我通過書籍和谷歌搜索了各種方式,但我找不到我想要的方式..
select * from CAT
where birth between '2000-01-01' and '2009-12-31'
or birth between '2010-01-01' and '2019-12-31'
or birth between '2020-01-01' and '2029-12-31'
我嘗試使用'Between'或'-01-01',但如果選擇[2000, 2020],則必須使用'or'連接。越多,速度越慢。
請告訴我一個能夠使用索引進行范圍計算的好方法。該索參考于 BirthDate。
添加)在我的資料庫中,'SUBSTRING(YEAR(CAT.birth),1,3)IN(200,202)'的查詢作業很快。我有500,000條資料,我可以這樣用嗎?
uj5u.com熱心網友回復:
您需要做的就是將索引添加到列并使用andbirth運行上面的查詢。BETWEENOR
uj5u.com熱心網友回復:
如果您使用的是 mysql,您是否嘗試過使用 YEAR() 函式?
例子:
SELECT * FROM cat WHERE YEAR(birth) BETWEEN 1990 AND 2018 ORDER BY YEAR(birth) ASC;
請檢查這個Mysql YEAR()
uj5u.com熱心網友回復:
如果您希望從表中獲得超過 20% 的行,那么INDEX將避免使用 an 來簡單地掃描所有行。
否則,擁有INDEX(birth)將有助于某些查詢,但到目前為止還沒有提到。它們中的每一個都不是“可分析的”。
要使用索引(并在有限的年份或日期范圍內有效),您可能需要這樣的東西。此示例涵蓋 2 個日歷年。
WHERE CAT.birth >= '2018-01-01'
AND CAT.birth < '2020-01-01'
順便說一句:SUBSTRING(YEAR(CAT.birth),1,3)可以簡化為LEFT(CAT.birth, 3),但仍然不能使用推薦的索引。
順便說一句:您的代碼中的一個“錯誤”:由于birth是 a DATETIME,and '2009-12-31'因此不包括新年前夜的午夜。請注意我是如何通過使用<和第二天來避免這個常見的“錯誤”的。無論您有DATE,DATETIME還是DATETIME(6), 等都有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/474470.html
上一篇:在查詢優化方面需要幫助
