MySQLで前月の行を取得:DATE_SUB()関数とMONTH()関数を使いこなそう
MySQLで前月のすべての行を取得するクエリ
このチュートリアルでは、MySQLを使用して前月のすべての行を取得する方法について説明します。これを行うには、いくつかの異なる方法がありますが、最も一般的な方法は、WHERE
句とDATE_SUB()
関数を使用する方法です。
方法 1: DATE_SUB()関数を使用する
SELECT *
FROM your_table
WHERE date_column BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE();
このクエリは次のように動作します。
DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
:この部分は、現在の日付から1か月前の日付を計算します。BETWEEN
:この句は、date_column
の値が1か月前の日付と現在の日付の間にある行のみを返すようにします。
方法 2: MONTH()とYEAR()関数を使用する
SELECT *
FROM your_table
WHERE MONTH(date_column) = MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
AND YEAR(date_column) = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 MONTH));
MONTH(date_column)
:この部分は、date_column
の月の値を抽出します。AND
:この論理演算子は、両方の条件 (月と年) が真の場合にのみ行を返すようにします。
例
次の表は、orders
テーブルの構造を示しています。
列名 | データ型 | 説明 |
---|---|---|
order_id | INT | 注文ID |
customer_id | INT | 顧客ID |
order_date | DATE | 注文日 |
order_amount | DECIMAL(10,2) | 注文金額 |
このテーブルを使用して、前月のすべての注文を取得するには、次のクエリを使用できます。
SELECT *
FROM orders
WHERE order_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE();
このクエリは、order_id
、customer_id
、order_date
、およびorder_amount
列を含む、前月のすべての注文を返します。
ヒント
- 上記のクエリをさらにカスタマイズして、特定の列のみを選択したり、WHERE句に他の条件を追加したりできます。
DATE_SUB()
関数を使用して、現在の日付から任意の日付を計算できます。たとえば、2か月前のすべての行を取得するには、DATE_SUB(CURDATE(), INTERVAL 2 MONTH)
を使用できます。
-- テーブル構造
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
order_amount DECIMAL(10,2)
);
-- サンプルデータ挿入
INSERT INTO orders (order_id, customer_id, order_date, order_amount)
VALUES
(1, 123, '2024-05-15', 100.00),
(2, 456, '2024-05-22', 50.00),
(3, 789, '2024-06-01', 200.00);
-- 前月のすべての注文を取得する
SELECT *
FROM orders
WHERE order_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE();
結果
order_id | customer_id | order_date | order_amount
------- | -------- | -------- | --------
1 | 123 | 2024-05-15 | 100.00
2 | 456 | 2024-05-22 | 50.00
説明
- 最初の部分 (
CREATE TABLE...
) は、orders
テーブルを作成し、その列とデータ型を定義します。 - 2番目の部分 (
INSERT INTO...
) は、サンプルデータをテーブルに挿入します。 - 3番目の部分 (
SELECT *...
) は、前月のすべての注文を取得するクエリです。このクエリは、WHERE
句とDATE_SUB()
関数を使用して、order_date
列の値が1か月前の日付と現在の日付の間にある行のみを返します。
このコードは、前月のすべての行を取得する方法を理解するのに役立ちます。必要に応じて、独自のテーブル構造やデータを使用してクエリをカスタマイズできます。
他の方法
SELECT *
FROM your_table
WHERE EXTRACT(MONTH FROM date_column) = MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
AND EXTRACT(YEAR FROM date_column) = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 MONTH));
このクエリは、EXTRACT()
関数を使用して、date_column
の月の値と年の値を抽出します。その後、これらの値を1か月前の月の値と比較して、一致する行のみを返します。
方法 4: サブクエリを使用する
SELECT *
FROM your_table
WHERE date_column IN (
SELECT date_column
FROM your_table
WHERE MONTH(date_column) = MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
AND YEAR(date_column) = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
);
このクエリは、サブクエリを使用して、1か月前の月の値を持つ行のリストを取得します。その後、このリストを使用して、メインクエリで一致する行のみを返します。
CREATE VIEW previous_month_orders AS
SELECT *
FROM orders
WHERE MONTH(order_date) = MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
AND YEAR(order_date) = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 MONTH));
SELECT *
FROM previous_month_orders;
このクエリは、previous_month_orders
という名前のビューを作成します。このビューには、前月のすべての注文が含まれます。その後、このビューを使用して、前月のすべての注文を取得するクエリを実行できます。
どの方法を選択するかは、個々のニーズによって異なります。最も単純な方法は、方法 1 または方法 2 です。これらの方法は、短くて読みやすいコードで済みます。一方、方法 3、方法 4、および方法 5 は、より複雑ですが、より多くの柔軟性と制御性を提供します。
その他の考慮事項
- 上記のクエリはすべて、
date_column
列がDATE
またはDATETIME
データ型であることを前提としています。これらの列が別のデータ型の場合は、クエリを修正する必要があります。 - 多くの場合、パフォーマンスを向上させるために、インデックスを使用する必要があります。詳細については、MySQL のドキュメントを参照してください。
mysql