如何选择具有当前日期时间戳的行?

Jac*_*son 93 mysql sql timestamp

我试图从数据库表中只选择今天的记录.

目前我用

SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Run Code Online (Sandbox Code Playgroud)

但这需要过去24小时的结果,我需要它只选择今天的结果,忽略时间.如何仅根据日期选择结果?

Joh*_*Woo 171

使用DATECURDATE()

SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
Run Code Online (Sandbox Code Playgroud)

我猜使用DATE 仍然使用INDEX.

看看DEMO上的执行计划


ype*_*eᵀᴹ 51

如果要使用索引并且查询不进行表扫描:

WHERE timestamp >= CURDATE()
  AND timestamp < CURDATE() + INTERVAL 1 DAY
Run Code Online (Sandbox Code Playgroud)

为了显示这对实际执行计划的不同,我们将使用SQL-Fiddle(一个非常有用的站点)进行测试:

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') ;
Run Code Online (Sandbox Code Playgroud)

让我们现在尝试2个版本.


版本1与 DATE(timestamp) = ?

EXPLAIN
SELECT * FROM test 
WHERE DATE(timestamp) = CURDATE()            ---  using DATE(timestamp)
ORDER BY timestamp ;
Run Code Online (Sandbox Code Playgroud)

说明:

ID  SELECT_TYPE  TABLE  TYPE  POSSIBLE_KEYS  KEY  KEY_LEN  REF 
1   SIMPLE       test   ALL

ROWS  FILTERED  EXTRA
6671  100       Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)

过滤所有(6671)行然后执行文件排序(这不是问题,因为返回的行很少)


版本2与 timestamp <= ? AND timestamp < ?

EXPLAIN
SELECT * FROM test 
WHERE timestamp >= CURDATE()
  AND timestamp < CURDATE() + INTERVAL 1 DAY
ORDER BY timestamp ;
Run Code Online (Sandbox Code Playgroud)

说明:

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
Run Code Online (Sandbox Code Playgroud)

它对索引使用范围扫描,然后仅从表中读取相应的行.


Ham*_*sia 10

SELECT * FROM `table` WHERE timestamp >= CURDATE()
Run Code Online (Sandbox Code Playgroud)

它更短,没有必要使用'AND timestamp <CURDATE()+ INTERVAL 1 DAY'

因为CURDATE()总是返回当前日期

MySQL CURDATE()函数