PostgreSQLで過去10日間のレコードを抽出!WHERE句とdate_trunc関数を使いこなそう
PostgreSQLで過去10日間のレコードを一覧表示する方法
このチュートリアルでは、PostgreSQLを使用して過去10日間のレコードを一覧表示する2つの方法を説明します。
方法1:WHERE句とCURRENT_DATE関数を使用する
この方法は、CURRENT_DATE
関数を使用して現在の日付を取得し、WHERE
句で比較することで過去10日間のレコードを抽出します。
手順
- PostgreSQLクライアントに接続します。
- 以下のSQLクエリを実行します。
SELECT *
FROM テーブル名
WHERE 作成日 >= CURRENT_DATE - INTERVAL '10 days';
解説
*
: テーブルのすべての列を選択します。テーブル名
: レコードを取得するテーブルの名前を指定します。作成日
: 比較対象となる日付列の名前を指定します。CURRENT_DATE
: 現在の日付を取得します。INTERVAL '10 days'
: 現在の日付から10日前の日付を取得します。>=
: 比較演算子で、作成日
が10日前の日付以上であることを意味します。
例
orders
テーブルにcreated_at
という日付列があると仮定します。過去10日間の注文を一覧表示するには、以下のクエリを実行します。
SELECT *
FROM orders
WHERE created_at >= CURRENT_DATE - INTERVAL '10 days';
この方法は、date_trunc
関数を使用して日付を切り捨て、過去10日間のレコードを抽出します。
SELECT *
FROM テーブル名
WHERE date_trunc('day', 作成日) >= CURRENT_DATE - INTERVAL '10 days';
date_trunc('day', 作成日)
:作成日
を日単位で切り捨てます。
SELECT *
FROM orders
WHERE date_trunc('day', created_at) >= CURRENT_DATE - INTERVAL '10 days';
- 方法1はシンプルで分かりやすいですが、日付列のデータ型が
date
型でない場合、エラーが発生する可能性があります。 - 方法2はデータ型に依存せず使用できますが、
date_trunc
関数はデータベースによって異なる場合があるので、注意が必要です。
-- テーブル名: orders
-- 作成日: created_at (timestamp型)
SELECT *
FROM orders
WHERE created_at >= CURRENT_DATE - INTERVAL '10 days';
結果
| order_id | customer_id | product_id | created_at |
|---|---|---|---|
| 1 | 10 | 100 | 2024-03-18 |
| 2 | 11 | 101 | 2024-03-19 |
| 3 | 12 | 102 | 2024-03-20 |
| ... | ... | ... | ... |
方法2:date_trunc関数を使用する
-- テーブル名: orders
-- 作成日: created_at (timestamp型)
SELECT *
FROM orders
WHERE date_trunc('day', created_at) >= CURRENT_DATE - INTERVAL '10 days';
| order_id | customer_id | product_id | created_at |
|---|---|---|---|
| 1 | 10 | 100 | 2024-03-18 |
| 2 | 11 | 101 | 2024-03-19 |
| 3 | 12 | 102 | 2024-03-20 |
| ... | ... | ... | ... |
補足
- 上記のサンプルコードは、
orders
テーブルにcreated_at
というtimestamp型の列があることを前提としています。 - 他のデータ型を使用する場合は、
WHERE
句の比較演算子を調整する必要があります。 - 例えば、
created_at
列がdate型の場合、比較演算子を=
に変更する必要があります。
SELECT *
FROM orders
WHERE created_at = CURRENT_DATE - INTERVAL '10 days';
PostgreSQLで過去10日間のレコードを一覧表示するその他の方法
generate_series
関数を使用して、過去10日間のすべての日期を生成し、IN
句で比較することで過去10日間のレコードを抽出します。
SELECT *
FROM テーブル名
WHERE 作成日 IN (
SELECT generate_series(CURRENT_DATE - INTERVAL '10 days', CURRENT_DATE, INTERVAL '1 day')
);
generate_series(CURRENT_DATE - INTERVAL '10 days', CURRENT_DATE, INTERVAL '1 day')
: 過去10日間のすべての日期を生成します。
SELECT *
FROM orders
WHERE created_at IN (
SELECT generate_series(CURRENT_DATE - INTERVAL '10 days', CURRENT_DATE, INTERVAL '1 day')
);
方法4:subqueryを使用する
過去10日間のレコードを抽出するサブクエリを作成し、メインクエリで結合することで過去10日間のレコードを一覧表示します。
SELECT *
FROM テーブル名
WHERE 作成日 >= (
SELECT date_trunc('day', CURRENT_DATE) - INTERVAL '10 days'
);
(SELECT date_trunc('day', CURRENT_DATE) - INTERVAL '10 days')
: 過去10日前の日付を取得します。
SELECT *
FROM orders
WHERE created_at >= (
SELECT date_trunc('day', CURRENT_DATE) - INTERVAL '10 days'
);
- 方法3は、過去10日間のすべてのレコードを確実に抽出できますが、他の方法よりも処理速度が遅くなる可能性があります。
- 方法4は、処理速度が速いですが、過去10日間にレコードがない場合は何も表示されません。
sql postgresql