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

时间:2013-02-08 09:06:05

标签: mysql sql timestamp

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

目前我使用

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

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

9 个答案:

答案 0 :(得分:162)

使用DATECURDATE()

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

我猜使用DATE 仍使用INDEX

see the execution plan on the DEMO

答案 1 :(得分:49)

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

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

为了显示这对实际执行计划的不同,我们将使用 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') ;

让我们现在尝试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)行,然后执行文件排序(由于返回的行很少,这不是问题)


版本2, 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

它在索引上使用范围扫描,然后只从表中读取相应的行。

答案 2 :(得分:8)

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

它更短,不需要使用'AND timestamp&lt; CURDATE()+ INTERVAL 1 DAY'

因为CURDATE()总是返回当天

MySQL CURDATE() Function

答案 3 :(得分:4)

或者您可以使用CURRENT_DATE替代方法,结果相同:

SELECT * FROM yourtable WHERE created >= CURRENT_DATE

Examples from database.guide

答案 4 :(得分:2)

我们可以为这只猫涂多少种方法?这是另一种变体。

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

答案 5 :(得分:1)

简单地把它投到日期:

SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)

答案 6 :(得分:0)

在我看来,这可能是最简单的:

SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');

答案 7 :(得分:0)

如果要与特定日期比较,可以直接将其写为:

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

//这里的时间戳是类型为时间戳的列的名称

要获取今天的日期,可以使用CURDATE()函数,因此:

select * from `table_name` where timestamp >=  CURDATE();

答案 8 :(得分:0)

在Visual Studio 2017上,使用内置数据库进行开发时,我在使用当前给定的解决方案时遇到了问题,我不得不更改代码以使其起作用,因为它引发了DATE()不是内置函数的错误

这是我的解决方法:

where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)