How to select rows that have current day's timestamp?

后端 未结 9 1607
渐次进展
渐次进展 2020-11-28 21:14

I am trying to select only today\'s records from a database table.

Currently I use

SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTE         


        
相关标签:
9条回答
  • 2020-11-28 21:53

    This could be the easiest in my opinion:

    SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');
    
    0 讨论(0)
  • 2020-11-28 21:59

    If you want an index to be used and the query not to do a table scan:

    WHERE timestamp >= CURDATE()
      AND timestamp < CURDATE() + INTERVAL 1 DAY
    

    To show the difference that this makes on the actual execution plans, we'll test with an SQL-Fiddle (an extremely helpful site):

    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') ;
    

    Lets try the 2 versions now.


    Version 1 with DATE(timestamp) = ?

    EXPLAIN
    SELECT * FROM test 
    WHERE DATE(timestamp) = CURDATE()            ---  using DATE(timestamp)
    ORDER BY timestamp ;
    

    Explain:

    ID  SELECT_TYPE  TABLE  TYPE  POSSIBLE_KEYS  KEY  KEY_LEN  REF 
    1   SIMPLE       test   ALL
    
    ROWS  FILTERED  EXTRA
    6671  100       Using where; Using filesort
    

    It filters all (6671) rows and then does a filesort (that's not a problem as the returned rows are few)


    Version 2 with timestamp <= ? AND timestamp < ?

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

    Explain:

    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
    

    It uses a range scan on the index, and then reads only the corresponding rows from the table.

    0 讨论(0)
  • 2020-11-28 22:04

    How many ways can we skin this cat? Here is yet another variant.

    SELECT * FROM table WHERE DATE(FROM_UNIXTIME(timestamp)) = '2015-11-18';

    0 讨论(0)
  • 2020-11-28 22:07

    If you want to compare with a particular date , You can directly write it like :

    select * from `table_name` where timestamp >= '2018-07-07';
    

    // here the timestamp is the name of the column having type as timestamp

    or

    For fetching today date , CURDATE() function is available , so :

    select * from `table_name` where timestamp >=  CURDATE();
    
    0 讨论(0)
  • 2020-11-28 22:09

    use DATE and CURDATE()

    SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
    

    I guess using DATE still uses INDEX.

    see the execution plan on the DEMO

    0 讨论(0)
  • 2020-11-28 22:10

    Or you could use the CURRENT_DATE alternative, with the same result:

    SELECT * FROM yourtable WHERE created >= CURRENT_DATE
    

    Examples from database.guide

    0 讨论(0)
提交回复
热议问题