MySQLで現在日付から過去2日間のレコードを取得する方法
MySQLにおいて、現在の日付を基準に過去2日間のレコードを抽出したい場合、DATE_SUB()関数を使用します。さらに、NOW()関数を組み合わせることで、現在の日付・時刻を動的に取得できます。
基本構文
過去2日間のレコードを取得するための基本的なSQL構文は以下の通りです。
SELECT * FROM yourTableName
WHERE yourDateTimeColumnName BETWEEN DATE_SUB(DATE(NOW()), INTERVAL 2 DAY)
AND DATE_SUB(DATE(NOW()), INTERVAL 1 DAY);
実例で確認しよう
ここからは、実際にテーブルを作成し、過去2日間のレコードを取得する流れを順番に見ていきましょう。
1. テーブルの作成
まず、サンプル用のテーブルを作成します。Idカラムは自動採番(AUTO_INCREMENT)の主キーとし、投稿日時を保存するdatetime型のカラムを用意します。
mysql> create table get2daysAgoDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(20),
-> PostDateTime datetime
-> );
Query OK, 0 rows affected (1.70 sec)
2. レコードの挿入
次に、INSERT文を使ってテーブルに複数のレコードを挿入します。
mysql> insert into get2daysAgoDemo(Name,PostDateTime) values('Larry',now());
Query OK, 1 row affected (0.68 sec)
mysql> insert into get2daysAgoDemo(Name,PostDateTime) values('Mike','2019-02-13');
Query OK, 1 row affected (0.12 sec)
mysql> insert into get2daysAgoDemo(Name,PostDateTime) values('Sam','2019-01-31');
Query OK, 1 row affected (0.15 sec)
mysql> insert into get2daysAgoDemo(Name,PostDateTime) values('Bob','2019-02-14');
Query OK, 1 row affected (0.29 sec)
mysql> insert into get2daysAgoDemo(Name,PostDateTime) values('David','2019-02-12');
Query OK, 1 row affected (0.21 sec)
mysql> insert into get2daysAgoDemo(Name,PostDateTime) values('Carol','2019-02-11');
Query OK, 1 row affected (0.22 sec)3. 全レコードの表示
SELECT文でテーブル内のすべてのレコードを確認してみましょう。
mysql> select *from get2daysAgoDemo;
実行結果は以下の通りです。
+----+-------+---------------------+
| Id | Name | PostDateTime |
+----+-------+---------------------+
| 1 | Larry | 2019-02-15 21:47:10 |
| 2 | Mike | 2019-02-13 00:00:00 |
| 3 | Sam | 2019-01-31 00:00:00 |
| 4 | Bob | 2019-02-14 00:00:00 |
| 5 | David | 2019-02-12 00:00:00 |
| 6 | Carol | 2019-02-11 00:00:00 |
+----+-------+---------------------+
6 rows in set (0.00 sec)
過去2日間のレコードを抽出するクエリ
それでは本題です。現在日付が2019-02-15であるとして、過去2日間(2月13日と2月14日)のレコードを取得するクエリは以下のようになります。
mysql> select *from get2daysAgoDemo
-> where PostDateTime between DATE_SUB(DATE(NOW()), INTERVAL 2 DAY)
-> AND DATE_SUB(DATE(NOW()), INTERVAL 1 DAY);
実行結果を見ると、現在日付が2月15日なので、その前の2日間にあたる2月13日と2月14日のレコードのみが表示されています。
+----+------+---------------------+
| Id | Name | PostDateTime |
+----+------+---------------------+
| 2 | Mike | 2019-02-13 00:00:00 |
| 4 | Bob | 2019-02-14 00:00:00 |
+----+------+---------------------+
2 rows in set (0.01 sec)
ポイント解説
このクエリが正しく動作する仕組みを整理しておきましょう。
NOW()は現在の日付と時刻を返す関数ですが、DATE()で囲むことで日付部分だけを取り出しています。DATE_SUB()は指定した日付から一定の間隔を引いた値を計算する関数で、「INTERVAL 2 DAY」なら2日前、「INTERVAL 1 DAY」なら1日前の日付を求められます。
BETWEEN演算子により「2日前〜1日前」の範囲に含まれるレコードだけが抽出されるため、今日やそれ以前の古いデータは除外されます。なお、INTERVALの値を変更すれば、過去7日間や30日間など任意の期間に柔軟に対応できます。
-
MySQLで日付データから月の初日と末日を取得する方法
MySQLでは、日付型のカラムから「その月の最初の日」と「最後の日」を簡単に求めることができます。この記事では、実際にテーブルを作成し、サンプルデータを使いながら具体的な手順を解説します。1. テーブルの作成まず、日付を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> DueDate date -> ); Query OK, 0 rows affected (0.73 sec)2. レコードの挿入次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。mysql>
-
MySQLで現在の日付から1日以上の行を抽出する方法(INTERVALの使い方)
現在の日時を基準に「1日前以降」のデータを取得したい場合は、MySQLのINTERVALを使うと簡単に実現できます。この記事では、サンプルテーブルを作成し、実際に条件に合う行を抽出するまでの手順を順番に解説します。 1. 現在の日付を確認する まず、CURDATE()関数で現在の日付を確認しておきましょう。 mysql> select curdate(); +------------+ | curdate() | +------------+ | 2019-11-29 | +------------+ 1 row in set (0.00 sec) 現在の日付は「2019-11-29」