MySQL与日期和BETWEEN的陌生感

时间:2011-02-08 12:28:46

标签: mysql date between

我正在运行查询以获取介于某些日期之间的行(此示例的当前日期和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是一个日期时间。

5 个答案:

答案 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()将值显式转换为所需的数据类型。