MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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日間など任意の期間に柔軟に対応できます。

  1. MySQLで日付データから月の初日と末日を取得する方法

    MySQLでは、日付型のカラムから「その月の最初の日」と「最後の日」を簡単に求めることができます。この記事では、実際にテーブルを作成し、サンプルデータを使いながら具体的な手順を解説します。1. テーブルの作成まず、日付を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> DueDate date -> ); Query OK, 0 rows affected (0.73 sec)2. レコードの挿入次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。mysql>

  2. 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」