我正在尝试检索日期时间行
开始> '08:30:00'并开始和
开始>'2017-10-01'并开始这是我尝试过的:
SELECT Entrada , Saida FROM table
WHERE Saida IS NOT NULL
AND TIME(Entrada) BETWEEN '08:30:00' AND '18:00:00'
AND DATE(Entrada) BETWEEN '2017-04-01' AND '2017-05-01'
ORDER BY Entrada ASC
这将返回“ 2017-04-01”和“ 2017-05-01”之间的行,但不会返回“ 08:30:00”和“ 18:00:00”之间的行。
那我该如何处理这种情况呢?
最佳答案
问题尚不清楚,但我假设您想在2017年4月获得Entrada
和8:30
之间的值为18:00
的行。
您发布的查询应该可以正常工作,但是由于使用了函数(DATE(Entrada)
,TIME(Entrada)
),它不能使用索引。它处理整个表,并且随着时间的流逝和记录堆积到表中,它将运行得更慢。
在Entrada
列上有索引吗?
解决方案是将DATE(Entrada)
替换为条件,该条件将Entrada
的值与日期间隔进行比较,该日期间隔包括所需的所有每日间隔(包括夜间在内的整个2017年4月)。这种情况将使用Entrada
列上的索引来限制其进一步处理的行。第二个条件(针对TIME(Entrada)
)将仅处理按第一个条件过滤的记录,而不处理当前表中的所有记录。
查询是
SELECT Entrada, Saida
FROM table
WHERE Saida IS NOT NULL
AND Entrada BETWEEN '2017-04-01 00:00:00' AND '2017-04-30 23:59:59'
AND TIME(Entrada) BETWEEN '08:30:00' AND '18:00:00'
ORDER BY Entrada ASC
您也可以使用
Entrada BETWEEN '2017-04-01 08:30:00' AND '2017-04-30 18:00:00'
。关于mysql - mysql“AND”子句在datetime列上两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46725818/