SQL "BETWEEN" 请求不符合我的要求

SQL "BETWEEN" request not acting as I want

我的 SQL 请求有一些问题。

请求如下:

SELECT SUBSTR(`Date`, 1, 11) AS `format_date` 
FROM table 
HAVING `format_date` BETWEEN '07/06/2016' AND '16/06/2016'

当我 运行 请求时,我得到了不想要的结果,例如 "07/11/2014"。在做了一些测试之后,看起来请求只考虑了一天,但我真的不明白为什么。有什么想法吗?

您的问题可以概括为以下表达式...

SELECT '8' BETWEEN '7' AND '77';
+--------------------------+
| '8' BETWEEN '7' AND '77' |
+--------------------------+
|                        0 |
+--------------------------+

07/11/2014在给定的两个字符串之间。您比较的是字符串,而不是日期,但您得到的正是您所要求的。

这是你比较的:

"07/0" < "07/1" < "16/0"

尝试比较实际日期,或格式化您的字符串以便您可以使用它们 (YYYY/MM/DD)。

这个问题(及其接受的答案)应该可以帮助您将字符串转换为可用日期: how-to-convert-a-string-to-date-in-mysql

然后你们就可以互相比较真实的日期了。

你得到错误结果的原因已经很清楚了,你可以尝试以下;)

SELECT SUBSTR(`Date`, 1, 11) AS `format_date` 
FROM table 
HAVING STR_TO_DATE(`format_date`, '%d/%m/%Y') BETWEEN STR_TO_DATE('07/06/2016', '%d/%m/%Y') AND STR_TO_DATE('16/06/2016', '%d/%m/%Y')

而且我认为你应该将 HAVING 更改为 WHERE

有 3 个问题需要解决。

  1. 最简单的是你错误地使用了HAVING而不是WHERE。

  2. 您已将日期转换为 dd/mm/yyyy 形式的字符串。这里的问题是文本(字符串)的行为不像数字,例如在文本 1 和 10 中排序在 2 或 3 之前。因此,您要求在看起来像日期的字符串之间输入文本,但它不会以这种方式运行,因为它需要将日期处理为数字。

  3. Between 是处理日期范围的一种非常糟糕的方式。一种更可靠的方法是使用 >= 和 < 的组合,如下所示。

例子

SELECT SUBSTR(Date, 1, 11) AS `format_date` 
FROM table 
WHERE `date` >= '2016-06-06'' AND `date` < '2016-06-17'