mysql日期定义为String并由"date()"包装的区别是什么?

sna*_*ggs 1 mysql date

我有非常基本的查询:

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

pet*_*erm 5

除了其他人已经解释过的原因之外,在时间组件的列上查询日期范围的最佳可能和最友好的索引方式是

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使用您在此列上创建的任何索引(索引),从而有效地导致完整扫描.

在右侧进行所有必要的转换,将它们应用于常量(参数)值.


推荐阅读: