日期时间列上的mysql“AND”子句两次

时间:2017-10-13 08:38:48

标签: mysql database

我正在尝试检索日期时间行 开始> '08:30:00'和开始< '18:00:00' 和
开始> '2017-10-01'和
开始< “2017年11月1日”

这是我试过的:

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'之间的行。

那我怎么能处理这种情况呢?

2 个答案:

答案 0 :(得分:2)

问题不明确,但我假设您希望在2017年4月,Entrada8: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'

答案 1 :(得分:-2)

尝试使用MYSQL的EXTRACT()功能(参见here