MySQL SELECT * WHERE timestamp = TODAY
我试图从数据库表中只select今天的logging。
目前我使用
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY)); 但是这需要过去24小时的结果,我只需要从今天select结果,而忽略了时间。 我怎样才能根据dateselect结果?
 使用DATE和CURDATE() 
 SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE() 
  我想使用DATE 仍然使用INDEX 。 
请参阅DEMO上的执行计划
如果您希望使用索引,而查询不要执行表扫描:
 WHERE timestamp >= CURDATE() AND timestamp < CURDATE() + INTERVAL 1 DAY 
为了显示这在实际执行计划上的差异,我们将使用SQL-Fiddle (一个非常有用的站点)进行testing:
 CREATE TABLE test --- simple table ( id INT NOT NULL AUTO_INCREMENT ,`timestamp` datetime --- index timestamp , data VARCHAR(100) NOT NULL DEFAULT 'Sample data' , PRIMARY KEY (id) , INDEX t_IX (`timestamp`, id) ) ; INSERT INTO test (`timestamp`) VALUES ('2013-02-08 00:01:12'), --- --- insert about 7k rows ('2013-02-08 20:01:12') ; 
让我们现在尝试2个版本。
 版本1与DATE(timestamp) = ? 
 EXPLAIN SELECT * FROM test WHERE DATE(timestamp) = CURDATE() --- using DATE(timestamp) ORDER BY timestamp ; 
说明:
 ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF 1 SIMPLE test ALL ROWS FILTERED EXTRA 6671 100 Using where; Using filesort 
它过滤所有(6671)行 ,然后做一个文件(这不是一个问题,因为返回的行很less)
 版本2与timestamp <= ? AND timestamp < ? timestamp <= ? AND timestamp < ? 
 EXPLAIN SELECT * FROM test WHERE timestamp >= CURDATE() AND timestamp < CURDATE() + INTERVAL 1 DAY ORDER BY timestamp ; 
说明:
 ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF 1 SIMPLE test range t_IX t_IX 9 ROWS FILTERED EXTRA 2 100 Using where 
它在索引上使用范围扫描 ,然后只读取表中相应的行。
 SELECT * FROM `table` WHERE timestamp >= CURDATE() 
它比较短,没有必要使用'AND timestamp <CURDATE()+ INTERVAL 1 DAY'
因为CURDATE()总是返回当天
MySQL的CURDATE()函数
简单地把它投射到一个date:
 SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE) 
我们可以用这种方法去皮吗? 这是又一个变种。
  SELECT * FROM table WHERE DATE(FROM_UNIXTIME( timestamp ))='2015-11-18'; 
在我看来,这可能是最简单的:
 SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');