web-dev-qa-db-ja.com

当日のタイムスタンプを持つ行を選択する方法は?

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

現在使用しています

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

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

90
Jackie Honson

DATEおよびCURDATE()を使用します

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

推測するDATEを使用するまだINDEXを使用する.

デモの実行計画を参照

164
John Woo

インデックスを使用し、クエリでテーブルスキャンを実行しない場合:

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)行をフィルタリングし、その後ファイルソートを行います(返される行が少ないので問題ありません)


timestamp <= ? AND timestamp < ?のバージョン2

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

インデックスに対してrangeスキャンを使用し、テーブルから対応する行のみを読み取ります。

50
ypercubeᵀᴹ
SELECT * FROM `table` WHERE timestamp >= CURDATE()

それは短く、 'AND timestamp <CURDATE()+ INTERVAL 1 DAY'を使用する必要はありません

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

MySQL CURDATE()関数

9
Hamed Persia

この猫の皮は何通りできますか?さらに別のバリエーションがあります。

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

2
stefgosselin

日付にキャストするだけです:

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

特定の日付と比較したい場合、次のように直接書くことができます:

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

//ここで、タイムスタンプは、タイプがタイムスタンプである列の名前です

または

今日の日付を取得するために、CURDATE()関数が利用可能ですので、:

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

Visual Studio 2017では、現在の特定のソリューションで問題が発生した開発用の組み込みデータベースを使用して、DATE()が組み込み関数ではないというエラーがスローされるため、動作するようにコードを変更する必要がありました。

ここに私の解決策があります:

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

私の意見ではこれが一番簡単だろう:

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