我被难住了。我在 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/