127

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

目前我使用

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

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

4

10 回答 10

222

使用DATECURDATE()

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

警告!此查询没有有效地使用索引。有关更有效的解决方案,请参阅下面的答案

见 DEMO 上的执行计划

于 2013-02-08T09:07:20.717 回答
68

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

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 个版本。


版本 1DATE(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)行,然后进行文件排序(这不是问题,因为返回的行很少)


版本 2timestamp <= ? 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

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

于 2013-02-08T09:09:55.843 回答
11
SELECT * FROM `table` WHERE timestamp >= CURDATE()

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

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

MySQL CURDATE() 函数

于 2014-12-07T15:07:34.663 回答
4

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

SELECT * FROM yourtable WHERE created >= CURRENT_DATE

来自 database.guide 的示例

于 2020-02-24T15:27:54.537 回答
3

如果要与特定日期进行比较,可以直接这样写:

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

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

或者

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

select * from `table_name` where timestamp >=  CURDATE();
于 2018-07-07T21:43:45.103 回答
2

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

SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');
于 2016-03-26T09:28:51.403 回答
1

只需将其转换为日期:

SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
于 2013-02-08T09:07:44.873 回答
1

我们可以用多少种方法剥这只猫的皮?这是另一个变体。

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

于 2015-11-19T03:56:13.580 回答
0

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

这是我的解决方案:

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

于 2018-07-09T15:37:19.177 回答
0
SELECT * FROM table WHERE FROM_UNIXTIME(your_column_with_unix_time,'%Y-%m-%d') = CURDATE()
于 2021-09-16T18:58:53.317 回答