127

データベース テーブルから今日のレコードのみを選択しようとしています。

現在私は使用しています

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

しかし、これには過去 24 時間の結果が必要であり、時間を無視して今日の結果のみを選択する必要があります。日付のみに基づいて結果を選択するにはどうすればよいですか?

4

10 に答える 10

222

使用DATEしてCURDATE()

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 タイムスタンプ < CURDATE() + INTERVAL 1 DAY」を使用する必要はありません。

CURDATE() は常に現在の日付を返すため

MySQL CURDATE() 関数

于 2014-12-07T15:07:34.663 に答える
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 に答える