我有非常基本的查询:
SELECT count(*) FROM myTable WHERE report_date='2013-12-01';
结果:
100
另一方面,后面的示例给出了其他结果(偏移量为1)
SELECT count(*) FROM myTable WHERE date(report_date) = '2013-12-01';
结果:
101 // Hmmm
请帮忙,
谢谢,
[编辑]
report_date
的类型为datetime
答案 0 :(得分:5)
除了其他人已经解释过的原因之外,在时间分量的列上查询日期范围的最佳可能和最友好的索引方式是
SELECT COUNT(*)
FROM myTable
WHERE report_date >= :start_date
AND report_date < :end_date + INTERVAL 1 DAY;
这是 SQLFiddle 演示
不要在DATE()
子句中的条件左侧使用任何函数(例如WHERE
),如示例所示
WHERE date(report_date) = '2013-12-01'
通过这样做,可以防止MySQL使用您在此列上创建的任何索引(索引),从而有效地进行完整扫描。
在右侧进行所有必要的转换,将它们应用于常量(参数)值。
推荐阅读:
答案 1 :(得分:3)
如果report_date
是DATETIME
或TIMESTAMP
,则它包含时间部分(默认为0:00)。如果您有一条值为'2013-12-01 3:42:00'的记录,则比较report_date = '2013-12-01'
将失败,因为右侧的字符串将转换为'2013-12-01 0: 00:00'这不是'2013-12-01 3:42:00'。
如果您应用DATE
,那么您将获得DATE('2013-12-01 3:42:00') = '2013-12-01'
,并且该记录将包含在结果集中。
答案 2 :(得分:1)
也许您的某条记录的时间戳记与report_date列中00:00:00
的其他时间戳相同。因此,与2013-12-01
进行匹配时不匹配。而当你明确使用DATE()时,只有日期部分匹配,时间戳被忽略