我有非常基本的查询:
SELECT count(*) FROM myTable WHERE report_date='2013-12-01';
Run Code Online (Sandbox Code Playgroud)
结果:
100
Run Code Online (Sandbox Code Playgroud)
另一方面,后面的例子给我其他结果(偏移量为1)
SELECT count(*) FROM myTable WHERE date(report_date) = '2013-12-01';
Run Code Online (Sandbox Code Playgroud)
结果:
101 // Hmmm
Run Code Online (Sandbox Code Playgroud)
请帮忙,
谢谢,
[编辑]
report_date 有一种类型 datetime
除了其他人已经解释过的原因之外,在时间组件的列上查询日期范围的最佳可能和最友好的索引方式是
SELECT COUNT(*)
FROM myTable
WHERE report_date >= :start_date
AND report_date < :end_date + INTERVAL 1 DAY;
Run Code Online (Sandbox Code Playgroud)
这是SQLFiddle演示
不要在例子DATE()中的WHERE条款的左侧使用任何函数(例如)
WHERE date(report_date) = '2013-12-01'
Run Code Online (Sandbox Code Playgroud)
通过这样做,您可以防止MySQL使用您在此列上创建的任何索引(索引),从而有效地导致完整扫描.
在右侧进行所有必要的转换,将它们应用于常量(参数)值.
推荐阅读: