我想从数据库中找到date
为"2013-04"的所有记录。
:
SELECT date, pastabos
FROM aktai
WHERE MATCH(uzsakovas) AGAINST ('Statyba ir Architektūra, UAB' IN BOOLEAN MODE)
AND MATCH(date) AGAINST ('2013-04*' IN BOOLEAN MODE)
,但它没有给出正确的答案,因为我得到的记录与日期等于' 2013-01-29', '2013-03-28'
。
我的问题是如何使用MATCH() AGAINST()
类功能LIKE()
与"2013-04%"
?
既然date
的数据类型是日期,为什么要使用文本搜索?只需搜索日期:
SELECT date, pastabos
FROM aktai
WHERE MATCH(uzsakovas) AGAINST ('Statyba ir Architektūra, UAB' IN BOOLEAN MODE)
AND year(date) = :year and month(date) = :month;
其中:year和:month为整数参数,值分别为2013和04。
或者
SELECT date, pastabos
FROM aktai
WHERE MATCH(uzsakovas) AGAINST ('Statyba ir Architektūra, UAB' IN BOOLEAN MODE)
AND date between :date_from and :date_to;
其中:date_from和:date_to为日期参数,分别为2013-04-01
和2013-04-30
。
'-'在全文搜索语法中有特殊含义(word应该不存在)。将短语用双引号括起来,只匹配字面上包含短语的行。例如:
match(date) against ('"2013-04"' in boolean mode)
一般来说,更好的方法是将日期作为日期类型处理,而不是字符串。
FULLTEXT
不是一个精确的操作,而且代价很高。在一个查询中有2个FULLTEXT
搜索总是一个坏主意。请使用LIKE
或日期函数。
1)
WHERE `date` LIKE '2013-04-%'
2)
WHERE YEAR(`date`) = 2013 AND MONTH(`date`) = 4
在查询的where子句中使用函数往往会降低生成速度,特别是在索引字段上。此外,如果日期字段包含时间组件,那么忽略时间组件可能会导致不正确的结果。
这种方法很难改进:
where yourdatefield >= StartDate
and yourdatefield < the day after EndDate
在您的示例中,StartDate是2013-04-01,EndDate的第二天是2013-05-01。由于使用的是日期参数,因此获取EndDate之后的日期应该不难。