我正在运行查询以获取介于某些日期之间的行(此示例的当前日期和7天前)。
我试着把它写成:
SELECT *
FROM faulttracker.ft_v_cases
WHERE DATE(cs_created) BETWEEN DATE(NOW()) AND DATE(NOW()-INTERVAL 7 DAY)
ORDER BY cs_created DESC;
但它返回0行。我无法理解为什么它不起作用,我尝试将其重写为:
SELECT *
FROM faulttracker.ft_v_cases
WHERE DATE(cs_created) <= DATE(NOW())
AND DATE(cs_created) >= DATE(NOW()-INTERVAL 7 DAY)
ORDER BY cs_created DESC;
哪个DID有效。
为什么第一个返回0行但第二个按预期工作?据我所知,它们应该在功能上等同。
cs_created是一个日期时间。
答案 0 :(得分:2)
根据documentation,BETWEEN需要以下格式:
expr BETWEEN min AND max
在您的第一个示例中,您将最小值放在最后。
尝试使用:
SELECT *
FROM faulttracker.ft_v_cases
WHERE DATE(cs_created) BETWEEN DATE(NOW()-INTERVAL 7 DAY) AND DATE(NOW())
ORDER BY cs_created DESC;
答案 1 :(得分:2)
我很确定你也可以使用:
WHERE cs_created >= CURDATE() - INTERVAL 7 DAY
AND cs_created < CURDATE() + INTERVAL 1 DAY
这应返回相同的结果,但也允许查询在cs_created
上使用索引。
答案 2 :(得分:1)
你的病情应该是 -
WHERE DATE(cs_created) BETWEEN DATE(NOW()-INTERVAL 7 DAY) AND DATE(NOW())
使用Between时,较低的日期值应位于左侧。
答案 3 :(得分:0)
您必须始终将范围视为BETWEEN smaller AND larger
;无论你是否写下,治疗都是一样的:
x BETWEEN smaller AND larger
x >= smaller AND x <= larger
因此,使用BETWEEN的代码需要写成:
SELECT *
FROM faulttracker.ft_v_cases
WHERE DATE(cs_created) BETWEEN DATE(NOW() - INTERVAL 7 DAY) AND DATE(NOW())
ORDER BY cs_created DESC;
这涵盖了过去的8天,当然,因为BETWEEN / AND的范围是包容性的。
答案 4 :(得分:-1)
SELECT *
FROM faulttracker.ft_v_cases
WHERE CAST(cs_created AS DATE) BETWEEN CAST(NOW() AS DATE) AND CAST(DATE(NOW()-INTERVAL 7 DAY) AS DATE)
ORDER BY cs_created DESC;
manual州:
要在BETWEEN与日期或时间值一起使用时获得最佳效果,请使用CAST()将值显式转换为所需的数据类型。