こんにちは、SIer勤務のごりらSEです。
本記事では、VARCHAR型日付から「現在日付の○年前」以降のデータを抽出する方法について、具体的なSQLクエリとともに紹介します。
【前提】テーブル定義
今回は以下のテーブル定義を前提で解説します。
・テーブル名:sample_table
・日付のカラム名:date_str
・フォーマット:yyyyMMdd
・データ型:VARCHAR
作成に使用したCREATE文はこちらです。
CREATE TABLE sample_table (
date_str VARCHAR(8)
);
数年前の同日以降を抽出するクエリ(TO_DATEを使う方法)
TO_DATEを使う方法では、以下のクエリで2年前の同日以降を抽出できます。
今日が2025-05-06の場合、2023-03-06以降のデータを抽出します。
SELECT *
FROM sample_table
WHERE TO_DATE(date_str, 'YYYYMMDD') >= CURRENT_DATE - INTERVAL '2 years';
要素 | 意味 |
---|---|
TO_DATE(date_str, ‘YYYYMMDD’) | date_str(VARCHAR型)をDATE型に変換 |
CURRENT_DATE | 今日の日付(DATE型) |
INTERVAL ‘2 years’ | 「2年」という期間(INTERVAL型) |
– 演算子 | DATE型 – INTERVAL型の引き算(結果はDATE型) |
TO_DATEはフォーマット指定が必要なため、変換対象の文字列には指定のフォーマット形式で正しく格納されている必要があります。万一不正な日付文字列が含まれているとエラーになるため注意が必要です。
数年前の同日以降を抽出するクエリ(CASTを使う方法)
CASTを使う方法では、以下のクエリで2年前の同日以降を抽出できます。
SELECT *
FROM sample_table
WHERE CAST(date_str AS DATE) >= CURRENT_DATE - INTERVAL '2 years';
要素 | 意味 |
---|---|
CAST(date_str AS DATE) | date_str(VARCHAR型)をDATE型に変換 |
CURRENT_DATE | 今日の日付(DATE型) |
INTERVAL ‘2 years’ | 「2年」という期間(INTERVAL型) |
– 演算子 | DATE型 – INTERVAL型の引き算(結果はDATE型) |
CASTはフォーマット指定をできないため、PostgreSQLの自動解釈頼みになります。
そのため、変換対象の文字列は’yyyy-MM-dd’形式や’yyyyMMdd’形式であれば認識できますが、これら以外の’yyyy/MM/dd’形式などは動くことがありますが、推奨できません。
TO_DATEとCASTのどちらを使うか
処理速度ではCASTの方がTO_DATEより高速です。そのため、以下の使い分けが良いです。
データ件数が多い・形式が統一されているならCAST
データ品質が保証されない・フォーマットが特殊ならTO_DATE
まとめ
VARCHAR型の日付から数年前のデータを抽出する方法を2パターン紹介しました。
ぜひ状況に応じて活用してみてください。
コメント