データベーステーブルから今日のレコードのみを選択しようとしています。
現在使用しています
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
しかし、これには過去24時間の結果が必要であり、時間を無視して今日からの結果のみを選択する必要があります。日付のみに基づいて結果を選択するにはどうすればよいですか?
DATE
およびCURDATE()
を使用します
SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
推測するDATE
を使用するまだINDEXを使用する.
インデックスを使用し、クエリでテーブルスキャンを実行しない場合:
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スキャンを使用し、テーブルから対応する行のみを読み取ります。
SELECT * FROM `table` WHERE timestamp >= CURDATE()
それは短く、 'AND timestamp <CURDATE()+ INTERVAL 1 DAY'を使用する必要はありません
cURDATE()は常に現在の日を返すため
この猫の皮は何通りできますか?さらに別のバリエーションがあります。
SELECT * FROM table
WHERE DATE(FROM_UNIXTIME(timestamp
))= '2015-11-18';
日付にキャストするだけです:
SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
特定の日付と比較したい場合、次のように直接書くことができます:
select * from `table_name` where timestamp >= '2018-07-07';
//ここで、タイムスタンプは、タイプがタイムスタンプである列の名前です
または
今日の日付を取得するために、CURDATE()関数が利用可能ですので、:
select * from `table_name` where timestamp >= CURDATE();
Visual Studio 2017では、現在の特定のソリューションで問題が発生した開発用の組み込みデータベースを使用して、DATE()が組み込み関数ではないというエラーがスローされるため、動作するようにコードを変更する必要がありました。
ここに私の解決策があります:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)
私の意見ではこれが一番簡単だろう:
SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');