【SQL初心者向け】30日前のデータを簡単に見つける!PostgreSQLで過去データを絞り込む方法
PostgreSQL で30日以上前のすべてのレコードを取得するSQL
例:
SELECT * FROM your_table
WHERE your_date_column < CURRENT_DATE - INTERVAL '30 days';
説明:
your_table
: 取得したいレコードが存在するテーブル名に置き換えます。your_date_column
: レコードの日付情報が格納されている列名に置き換えます。CURRENT_DATE
: 現在の日付を取得します。INTERVAL '30 days'
: 30日間の差を表します。WHERE
句: レコードの日付が30日以上前の場合のみ、レコードを選択するように条件を指定します。
補足:
CURRENT_DATE
関数以外にも、NOW()
関数を使用して現在の日付と時刻を取得することもできます。- 30日ではなく、別の期間を取得したい場合は、
INTERVAL 'n days'
の部分をINTERVAL 'n days'
に置き換えてください。 - 特定の列のみを取得したい場合は、
SELECT
句で取得したい列を指定してください。
SELECT id, name, created_at
FROM your_table
WHERE created_at < CURRENT_DATE - INTERVAL '30 days';
このSQLは、your_table
テーブルから id
、name
、created_at
列の値を取得し、created_at
列の日付が30日以上前のレコードのみを選択します。
注意事項:
- PostgreSQL のバージョンによって、
CURRENT_DATE
関数やINTERVAL
構文の動作が異なる場合があります。詳細は、PostgreSQL の公式ドキュメントを参照してください。 - データベースのスキーマや列名は、ご自身の環境に合わせて変更してください。
PostgreSQL で30日以上前のすべてのレコードを取得するサンプルコード
- 使用している PostgreSQL のバージョン: 14
- 取得したいレコードが存在するテーブル名:
orders
- レコードの日付情報が格納されている列名:
order_date
SELECT *
FROM orders
WHERE order_date < CURRENT_DATE - INTERVAL '30 days';
解説:
- このコードは、
orders
テーブルからすべての列を取得します。 WHERE
句を使用して、order_date
列の日付が30日以上前のレコードのみを選択するように条件を指定しています。
実行方法:
- PostgreSQL クライアントを開きます。
- 上記のコードを貼り付けて実行します。
実行結果:
id | customer_id | product_id | quantity | order_date | total_price
-------+------------+------------+---------+------------+------------
1 | 1 | 10 | 2 | 2024-04-17 | 20.00
2 | 2 | 15 | 1 | 2024-04-05 | 15.00
3 | 3 | 20 | 3 | 2024-03-25 | 60.00
PostgreSQL で30日以上前のすべてのレコードを取得するその他の方法
PostgreSQL 11以降では、datediff()
関数を使用して、2つの日付間の日数差を計算できます。この関数を使用して、レコードの日付が30日以上前の場合のみレコードを選択する条件を指定できます。
SELECT *
FROM orders
WHERE datediff(day, order_date, CURRENT_DATE) >= 30;
datediff(day, order_date, CURRENT_DATE)
:order_date
列の日付と現在の日付との差を日数で計算します。>= 30
: 日数差が30日以上の場合のみ、レコードを選択します。
方法2: サブクエリを使用する
サブクエリを使用して、30日以上前の日付を取得し、WHERE
句でその日付と比較してレコードを選択することもできます。
SELECT *
FROM orders
WHERE order_date IN (
SELECT date_column
FROM your_table
WHERE date_column < CURRENT_DATE - INTERVAL '30 days'
);
- サブクエリ:
your_table
テーブルからdate_column
列の値を取得し、30日以上前の日付のみを選択します。 IN
:orders
テーブルのorder_date
列の値が、サブクエリで選択された日付と一致する場合のみ、レコードを選択します。
方法3: CTE (Common Table Expression) を使用する
CTE を使用して、30日以上前の日付を含む一時的な表を作成し、その表とorders
テーブルを結合してレコードを取得することもできます。
WITH old_dates AS (
SELECT date_column
FROM your_table
WHERE date_column < CURRENT_DATE - INTERVAL '30 days'
)
SELECT *
FROM orders
JOIN old_dates ON orders.order_date = old_dates.date_column;
WITH old_dates AS ( ... )
: CTE を定義します。この CTE はold_dates
という名前で、30日以上前の日付を含む表を作成します。JOIN
:orders
テーブルとold_dates
テーブルをorder_date
列で結合します。
- シンプルでわかりやすい方法: 方法1 (datediff() 関数を使用する) がおすすめです。
- 古いバージョンの PostgreSQL を使用している場合: 方法2 (サブクエリを使用する) または 方法3 (CTE を使用する) を使用する必要があります。
- 複雑なクエリの一部として使用する場合: 方法3 (CTE を使用する) が柔軟性と可読性に優れています。
sql postgresql