How do I match an entire day to a datetime field?

后端 未结 3 1161
不知归路
不知归路 2020-12-11 12:09

I have a table for matches. The table has a column named matchdate, which is a datetime field.

If I have 3 matches on 2011-12-01:

相关标签:
3条回答
  • 2020-12-11 12:51

    Just use the SQL BETWEEN function like so:

    SELECT * FROM table WHERE date BETWEEN '2011-12-01' AND '2011-12-02'
    

    You may need to include times in the date literals, but this should include the lover limit and exclude the upper.

    From rails I believe you can do:

    .where(:between => '2011-12-01'..'2011-12-02')
    
    0 讨论(0)
  • 2020-12-11 13:00

    not sure if i am missing something obvious here, but i think you can just

    select * from table where date_trunc('day', ts) = '2011-12-01';
    
    0 讨论(0)
  • 2020-12-11 13:01

    Cast your timestamp value to date if you want simple syntax. Like this:

    SELECT *
    FROM   tbl
    WHERE  timestamp_col::date = '2011-12-01';  -- date literal
    

    However, with big tables this will be faster:

    SELECT *
    FROM   tbl
    WHERE  timestamp_col >= '2011-12-01 0:0'    -- timestamp literal
    AND    timestamp_col <  '2011-12-02 0:0';
    

    Reason: the second query does not have to transform every single value in the table and can utilize a simple index on the timestamp column. The expression is sargable.

    Note excluded the upper bound (< instead of <=) for a correct selection.
    You can make up for that by creating an index on an expression like this:

    CREATE INDEX tbl_ts_date_idx ON tbl (cast(timestamp_col AS date));
    

    Then the first version of the query will be as fast as it gets.

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