2

我想从数据库中找到所有记录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()likeLIKE() 功能"2013-04%"

4

4 回答 4

3

既然数据类型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 是 Date 参数,其值分别为2013-04-012013-04-30

于 2013-04-30T22:26:52.857 回答
1

'-' 在全文搜索语法中具有特殊含义(单词应该不存在)。将短语括在双引号中以仅匹配包含该短语的行。IE:

match(date) against ('"2013-04"' in boolean mode)

而且,通常,更好的方法是将日期处理为日期类型,而不是字符串。

于 2013-04-30T22:20:09.797 回答
1

FULLTEXT不是一个精确的操作,而且它很昂贵。FULLTEXT在 1 个查询中进行2 个搜索总是一个坏主意。请改用LIKE或日期函数。

1)

WHERE `date` LIKE '2013-04-%' 

2)

WHERE YEAR(`date`) = 2013 AND MONTH(`date`) = 4
于 2013-04-30T22:27:25.000 回答
0

在查询的 where 子句中使用函数往往会减慢生产速度,尤其是在索引字段上。此外,如果您的日期字段包含时间组件(通常是这种情况),那么忽略时间组件可能会导致不正确的结果。

这种方法很难改进:

 where yourdatefield >= StartDate
 and yourdatefield < the day after EndDate

在您的情况下,StartDate 是 2013-04-01,EndDate 之后的第二天是 2013-05-01。由于您使用的是日期参数,因此获取 EndDate 之后的日期应该不难。

于 2013-04-30T23:10:09.623 回答