2

我正在运行查询以获取介于特定日期之间的行(本示例中为当前日期和 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;

哪个确实有效。

为什么第一个返回 0 行但第二个按预期工作?据我所见,它们在功能上应该是等效的。

cs_created 是一个日期时间。

4

5 回答 5

2

根据文档,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;
于 2011-02-08T12:33:10.513 回答
2

我很确定您也可以使用:

WHERE cs_created >= CURDATE() - INTERVAL 7 DAY 
  AND cs_created <  CURDATE() + INTERVAL 1 DAY

这应该返回相同的结果,但也允许查询使用索引cs_created

于 2011-02-08T12:42:48.363 回答
1

你的情况应该是——

WHERE DATE(cs_created) BETWEEN DATE(NOW()-INTERVAL 7 DAY) AND DATE(NOW())

使用 Between 时,较低的日期值应位于左侧。

于 2011-02-08T12:31:22.503 回答
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 的范围包括在内。

于 2011-02-08T12:31:50.367 回答
-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;

手册指出:

要在将 BETWEEN 与日期或时间值一起使用时获得最佳结果,请使用 CAST() 将值显式转换为所需的数据类型。

于 2011-02-08T12:33:23.970 回答