MySQL现在有点不直观:
查询包含带有比较的where子句:WHERE t.date = '2016-12-31'
(t.date-s数据类型是date(!).. 它不返回任何执行记录。但查询:WHERE t.date > '2016-12-31'
-返回其他记录中date
等于“2016-12-31”的记录!2016年12月31日的记录也出现了,以防我使用了BETWEEN '20161231' AND '20170101'
。尝试格式化,类型更改-没有帮助。在花了一段时间寻找原因之后,我做了以下操作:手动更新记录的date
列,将其设置为“2016-12-31”。此操作之后WHERE t.date = '2016-12-31'
开始按预期工作。
可能我遗漏了什么,想知道是什么导致了这种行为。
更新
日期是日期,不是日期时间
完成手动更新后,我无法再次重现上述行为:现在,任何类型的比较(=,DATE(…)=,STRCMP)都可以正常工作了!
更新2
2016-11-30和2016-09-30(月底!)发现了同样的行为!暂时不会手动更新记录来测试我在这里得到的建议。
更新3
我还对带有date列的表运行了OPTIMIZE TABLE来重建索引,以消除任何损坏问题。
更新4
这里有更多:
如果我检查日期字段的十六进制值是否有不正确的字段(月底),我会得到错误的值!SELECT HEX(t.date) FROM table t WHERE t.date BETWEEN DATE('20160930') AND DATE('20161001');
返回:
323031362D31302D3030
323031362D31302D3031SELECT HEX(DATE('20160930'));
返回:
323031362D30392D3330
还有323031362D330392D3330!=323031362D31302D3030SELECT X'323031362D31302D3030';
它返回:
2016-10-00,不是2016-09-30!
对于我手动更新的值-HEX是相同的。
但是,是什么导致了这种差异呢?
最佳答案
尝试使用
WHERE date(t.date) = '2016-12-31'
或
WHERE date(t.date) = str_to_date( '2016-12-31', '%Y-%m-%d')
或者根据你的测试
WHERE date(t.date) = str_to_date( '20161231', '%Y%m%d')
关于mysql - MySQL中的DATE类型比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42259445/