年度を取得するためのSQL

※当サイトではアフィリエイト広告を利用しています

システム開発やデータ分析の現場では、「○○年度生まれ」のユーザーを抽出したいというケースがよくあります。たとえば、「1994年度生まれ」とは、一般に 1994年4月2日から1995年4月1日まで に生まれた人のことを指します。

このような年度ベースでの絞り込みは、各種RDBMSで異なる対応が必要です。本記事では、SQLite、Oracle、PostgreSQL、MySQL それぞれで「年度生まれを取得するSQL」の実例を紹介します。


想定するテーブル構造

以下のような users テーブルを想定します。

CREATE TABLE users (
user_id INTEGER PRIMARY KEY,
name TEXT,
birth_date TEXT -- SQLiteでは文字列、他ではDATE型
);

SQLiteの場合:文字列の日付を整形して比較

SQLiteでは birth_date1994年4月2日 のような日本語フォーマットの文字列が入っているケースもあります。そのままでは正確に比較できないため、substr()printf() を使って構造的に日付を整形する必要があります。

SELECT user_id, name, birth_date
FROM users
WHERE printf('%04d-%02d-%02d',
substr(birth_date, 1, 4),
CAST(replace(substr(birth_date, instr(birth_date, '年') + 1, instr(birth_date, '月') - instr(birth_date, '年') - 1), '月', '') AS INTEGER),
CAST(replace(substr(birth_date, instr(birth_date, '月') + 1, instr(birth_date, '日') - instr(birth_date, '月') - 1), '日', '') AS INTEGER)
) BETWEEN '1994-04-02' AND '1995-04-01'
ORDER BY birth_date;

このSQLでは birth_dateYYYY-MM-DD に変換してから比較しているため、文字列型でも正確に日付順・範囲指定が可能です。


Oracleの場合:TO_DATEとBETWEENを使用

Oracleでは、birth_dateDATE 型であることが前提です。日付範囲は TO_DATE を使って明示的に指定します。

SELECT user_id, name, birth_date
FROM users
WHERE birth_date BETWEEN TO_DATE('1994-04-02', 'YYYY-MM-DD')
AND TO_DATE('1995-04-01', 'YYYY-MM-DD')
ORDER BY birth_date;

日付リテラルに TO_DATE を使うことで、Oracleの内部日付形式と正しくマッチします。


PostgreSQLの場合:DATE型と文字列リテラルの直接比較

PostgreSQLでは、文字列をそのまま DATE として比較できます。明示的なキャストも可能です。

SELECT user_id, name, birth_date
FROM users
WHERE birth_date BETWEEN DATE '1994-04-02' AND DATE '1995-04-01'
ORDER BY birth_date;

あるいは、'1994-04-02'::DATE のようにキャストすることもできます。日付型の扱いが柔軟なのがPostgreSQLの特徴です。


MySQLの場合:DATE型と文字列リテラルの比較

MySQLでも、DATE 型のカラムに対しては文字列リテラルで直接比較できます。

SELECT user_id, name, birth_date
FROM users
WHERE birth_date BETWEEN '1994-04-02' AND '1995-04-01'
ORDER BY birth_date;

MySQLでは 'YYYY-MM-DD' 形式の文字列を自動的に DATE に変換してくれるため、特別な変換は不要です。ただし、保存形式が揃っていることが前提です。


補足:日付の形式がバラバラな場合の対処法

どのデータベースでも、「日付の保存形式が統一されていない場合」は注意が必要です。特に、SQLiteやCSV由来のデータなどでは「1994年4月2日」「1994/4/2」「1994-4-2」など様々な形式で混在している可能性があります。

そのような場合は、以下のような処理を行うことが推奨されます。

  • アプリケーション側で正規化しておく
  • ビューで整形済の日付を別カラムに持つ
  • データ投入時に日付フォーマットを強制

コメント