MySQL

时间:2017-02-15 20:31:37

标签: mysql sql

现在对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,而不是DATETIME

手动更新后,我无法再次重现上述行为:现在任何类型的比较(=,DATE(..)=,STRCMP) - 都可以正常工作!
更新2
对于2016-11-30和2016-09-30(月末!)发现了同样的行为!暂时不会手动更新记录,以测试我在这里得到的建议 更新3
我还在该日期列的表上运行OPTIMIZE TABLE,以重建索引以消除任何损坏问题。
更新4
这里有更多:
如果我检查日期字段的HEX值是否有不正确的字段(月末)我得到错误的值!
SELECT HEX(t.date) FROM table t WHERE t.date BETWEEN DATE('20160930') AND DATE('20161001');
返回:
323031362D31302D3030
323031362D31302D3031
SELECT HEX(DATE('20160930'));
返回:
323031362D30392D3330
和323031362D30392D3330!= 323031362D31302D3030
SELECT X'323031362D31302D3030';
它返回:
2016-10-00,而非2016-09-30!
对于我手动更新的值 - HEX是相同的 但是什么能造成这样的差异呢?

2 个答案:

答案 0 :(得分:1)

尝试使用

强制格式化
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')

答案 1 :(得分:1)

经过一番调查后,我发现问题并没有直接与MySQL中的日期比较相关。如果有人遇到这种情况,我会在这里张贴 我发现问题在于在IDE中选择结果(在我的情况下为DataGrip):数据库中日期字段的值为2016-10- 00 并且选择返回2016- 09-30!那令人困惑..但是在找到00天之后 - 找到它的原因相对容易:CURDATE() - 1(在我的情况下应该有:CURDATE() - INTERVAL 1 DAY)。如果没有像INTERVAL这样的特定功能,请不要使用与日期相关的功能!!
感谢所有支持这个问题的人,对不起混淆,我也很困惑,只有经过几个步骤才能找到答案。