mysql日期定义为String并由“date()”包装有什么区别?

时间:2014-01-09 08:21:37

标签: mysql date

我有非常基本的查询:

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

3 个答案:

答案 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_dateDATETIMETIMESTAMP,则它包含时间部分(默认为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()时,只有日期部分匹配,时间戳被忽略

工作演示:http://sqlfiddle.com/#!2/ae63a/4