データベーステーブルから今日のレコードのみを選択しようとしています。
現在使用しています
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
しかし、これには過去24時間の結果が必要です。時間を無視して、今日の結果のみを選択する必要があります。日付のみに基づいて結果を選択するにはどうすればよいですか?
データベーステーブルから今日のレコードのみを選択しようとしています。
現在使用しています
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
しかし、これには過去24時間の結果が必要です。時間を無視して、今日の結果のみを選択する必要があります。日付のみに基づいて結果を選択するにはどうすればよいですか?
回答:
使用DATE
してCURDATE()
SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
DATE
まだINDEXを使用していると思います。
Using where; Using index
?
timestamp
(date
私の場合と同様)はMySQLの予約語です
インデックスを使用し、クエリでテーブルスキャンを実行しない場合:
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)の行をフィルタリングして、(返される行が少ないなどの問題ではありません)filesortレコードを行います
バージョン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
インデックスで範囲スキャンを使用し、対応する行のみをテーブルから読み取ります。
INDEX t_IX (timestamp, id)
(はず?)だけで可能性がありINDEX t_IX (timestamp)
、主キーがインデックスに暗示されるように、。それとも理解できない理由はありますか?私はsql-fiddleで試してみましたが、同じ(より良い)実行プランを見ました
id
(それはPKであり、したがってテーブルのクラスター化インデックスであるため)いずれにしてもインデックスに追加されます。そのため、明示的に追加しても問題ありません(また、オプティマイザの盲点を見つける可能性があります)。このケース/クエリには、確かに関係ありません。
timestamp < CURDATE() + INTERVAL 1 DAY
必要なのか説明できますか?
SELECT * FROM `table` WHERE timestamp >= CURDATE()
短く、「ANDタイムスタンプ<CURDATE()+間隔1日」を使用する必要はありません。
CURDATE()は常に現在の日付を返すため
特定の日付と比較したい場合は、次のように直接記述できます。
select * from `table_name` where timestamp >= '2018-07-07';
//ここで、タイムスタンプはタイプがタイムスタンプである列の名前です
または
今日の日付を取得するために、CURDATE()関数を使用できるため、次のようになります。
select * from `table_name` where timestamp >= CURDATE();
それを日付にキャストするだけです:
SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
これは私の意見では最も簡単かもしれません:
SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');
または、CURRENT_DATEの代替を使用しても、同じ結果になります。
SELECT * FROM yourtable WHERE created >= CURRENT_DATE
Visual Studio 2017では、組み込みデータベースを開発に使用していると、現在の特定のソリューションで問題が発生し、DATE()が組み込み関数ではないというエラーが発生したため、コードを変更して機能させる必要がありました。
これが私の解決策です:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)