我想查找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%"
一起使用?
答案 0 :(得分:3)
由于date
的数据类型为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
的日期参数。
答案 1 :(得分:1)
' - '在全文搜索语法中具有特殊含义(单词应该不存在)。将短语括在双引号中以仅匹配包含短语的行。即:
match(date) against ('"2013-04"' in boolean mode)
而且,通常,更好的方法是将日期作为日期类型处理,而不是字符串。
答案 2 :(得分:1)
FULLTEXT
不是一个精确的操作,而且价格昂贵。在1个查询中进行2次FULLTEXT
次搜索总是一个坏主意。改为使用LIKE
或日期函数。
1)
WHERE `date` LIKE '2013-04-%'
2)
WHERE YEAR(`date`) = 2013 AND MONTH(`date`) = 4
答案 3 :(得分:0)
在查询的where子句中使用函数会降低生产速度,尤其是在索引字段上。此外,如果您的日期字段包含时间组件(通常是这种情况),则忽略时间组件可能会导致错误的结果。
这种方法很难改进:
where yourdatefield >= StartDate
and yourdatefield < the day after EndDate
在您的情况下,StartDate是2013-04-01,EndDate是2013-05-01之后的第二天。由于您使用的是日期参数,因此在EndDate之后获取日期应该不难。