当使用 BETWEEN 或 >= & <= 时,mysql 查询返回超出 WHERE 范围的值

标签 mysql where-clause

我被难住了。我在 MySQL 数据库中有一个日期字段,是从 csv 文件填充的。日期字段的格式为 mdy,因此它可以有前导零(我认为这是问题所在)。因此,2015 年 8 月 9 日在 CSV 文件中为 080915,但在数据库中为 80915。该字段是 INT(6)

所以我有一个疑问:

SELECT sum(amt) as sum_amt FROM invoices WHERE invdt = 080915;

这非常有效。 我的数据库不包含 010115 之前的任何数据。 所以如果我使用:

SELECT sum(amt) as sum_amt FROM invoices WHERE invdt = 080914;

我没有得到任何结果,这是正确的。 但是,如果我使用:

SELECT sum(amt) as sum_amt FROM invoices WHERE invdt <= 080914;

我获取了从010115到080915的所有数据.. 如果我使用这样的范围:

SELECT sum(amt) as sum_amt FROM invoices WHERE invdt >= 080915 AND invdt <= 083115;

我得到了该范围内的正确数据,但如果我使用:

SELECT sum(amt) as sum_amt FROM invoices WHERE invdt >= 080914 AND invdt <= 083114; 

我得到的数据与日期范围为 2015 年的数据相同,即使日期是 2014 年。它应该不返回任何内容,因为该数据不存在。

因此,我尝试将该字段更改为 VARCHAR 而不是 INT,认为前导零将其丢弃。 我从 CSV 文件加载数据并查看它,现在该条目显示为 080915(有前导零)。 我不确定 varchar 是否可以在大于和小于容量的情况下工作,但只要数据存在,它似乎就可以正常工作。如果没有,它仍然返回值,就像字段是 INT 值时一样。

如果我使用 WHERE invdt = 080915 我会得到我应该得到的结果,如果我使用 WHERE invdt = 080914 我不会得到结果(我应该得到)。无论带引号还是不带引号,我都可以做到这一点,并且仍然得到正确的结果。一旦我尝试使用 BETWEEN 或 <= 和 >= 或它们的任意组合,如果数据库中不存在日期,我就会得到超出我指定的日期范围的数据。 所以这个查询:

SELECT sum(amt) as sum_amt FROM invoices WHERE invdt >= 080915 AND invdt <= 083115;

返回与以下完全相同的数据:

SELECT sum(amt) as sum_amt FROM invoices WHERE invdt >= 080914 AND invdt <= 083114;

???

无论该字段是 INT 还是 VARCHAR,它的作用就像 080914 与 080915 相同。
我在这里缺少什么?

最佳答案

您不是在比较日期,而是在比较 int(6) 的日期。 如果您要比较以整数存储的日期,那么将它们存储为首先存储为 yymmdd 的最高有效数字会更有意义。 083115和080314之间仅相差1,即一年。 如果您将其视为如何从最小到最大排序以及它们代表什么,我认为这是有道理的。

关于当使用 BETWEEN 或 >= & <= 时,mysql 查询返回超出 WHERE 范围的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32126849/

相关文章:

php - 从 1 个表格插入 2 个表格。 Mysql事务?

mysql - SQL按开发类型分组和值求和

PHP MySQL - INSERT 和 ON DUPLICATE KEY UPDATE with WHERE?

arrays - 如何找到数组中每个项目的字符数

mysql - 无法在 WHERE 子句中使用 SELECT 子句的别名

mysql - 在 where 子句中使用 if 语句

Mysql 5.0 LAST_INSERT_ID()升级到5.6后有所不同

php - 将 PHP MySQL REQUESTED DATE 输出为 XML 并以 HTML 读取

mysql拆分字段值并用两个字段检查条件

mySQL存储过程where子句问题