MySQL SELECT * WHERE timestamp = TODAY

我试图从数据库表中只select今天的logging。

目前我使用

SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY)); 

但是这需要过去24小时的结果,我只需要从今天select结果,而忽略了时间。 我怎样才能根据dateselect结果?

使用DATECURDATE()

 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(),'%');