我正在尝试检索日期时间行
开始> '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'之间的行。
那我怎么能处理这种情况呢?
答案 0 :(得分:2)
问题不明确,但我假设您希望在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'
。
答案 1 :(得分:-2)
尝试使用MYSQL的EXTRACT()
功能(参见here)