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
和 运行 您上面使用 BETWEEN
和 OR
的查询。
如果您正在使用 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':由于 birth
是 DATETIME
,因此 and '2009-12-31'
不包括新年前夜的午夜。请注意我是如何通过使用 <
和第二天避免这种常见的 'bug' 的。无论您有 DATE
、DATETIME
还是 DATETIME(6)
等,这都有效
我想获取猫的出生日期作为年份范围。
年份范围如下,可能有几个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
和 运行 您上面使用 BETWEEN
和 OR
的查询。
如果您正在使用 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':由于 birth
是 DATETIME
,因此 and '2009-12-31'
不包括新年前夜的午夜。请注意我是如何通过使用 <
和第二天避免这种常见的 'bug' 的。无论您有 DATE
、DATETIME
还是 DATETIME(6)
等,这都有效