mysql 按年份搜索范围

mysql Search range by year

我想获取猫的出生日期作为年份范围。

年份范围如下,可能有几个select离子

年份:[2000、2010、2020]

如果我select2020年,从2020-01-01到2029-12-31期间

如果我select2000年,2020年,从2000-01-01到2009-12-31和2020-01-01到2029-12-31。

<TABLE>
CAT {
 ID number,
 Birth DateTime,
...
}

我通过书籍和Google找了各种方法,但找不到我想要的方法..

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]是selected,则必须与'or'连接。 or越多,速度越慢

请告诉我一个可以使用索引进行范围计算的好方法。 该索引用于 BirthDate。

Add) 在我的数据库中,'SUBSTRING(YEAR(CAT.birth),1,3) IN (200,202)' 的查询工作很快。 我有50万条数据,可以这样用吗?

您需要做的就是将索引添加到列 birth 和 运行 您上面使用 BETWEENOR 的查询。

如果您正在使用 mysql,您是否尝试过使用 YEAR() 函数?

示例: SELECT * FROM cat WHERE YEAR(birth) BETWEEN 1990 AND 2018 ORDER BY YEAR(birth) ASC;

请检查这个Mysql YEAR()

如果您希望从 table 中获得超过 20% 的行,那么将避免使用 INDEX 来简单地扫描所有行。

否则,INDEX(birth) 将有助于 某些 查询,但 none 到目前为止提到的查询。他们每个人都不是 "sargable" .

要使用索引(并在有限的年份或日期范围内有效),您可能需要这样的东西。此示例涵盖 2 个日历年。

WHERE CAT.birth >= '2018-01-01'
  AND CAT.birth  < '2020-01-01'

顺便说一句:SUBSTRING(YEAR(CAT.birth),1,3)可以简化为LEFT(CAT.birth, 3),但仍然不能使用推荐的索引。

顺便说一句:代码中的 'bug':由于 birthDATETIME,因此 and '2009-12-31' 不包括新年前夜的午夜。请注意我是如何通过使用 < 和第二天避免这种常见的 'bug' 的。无论您有 DATEDATETIME 还是 DATETIME(6) 等,这都有效