先日、月別の広告費を管理する以下のようなテーブルから、期間を指定してデータを抽出することがあった。

idyearmonthcost
1202110100,000
220211190,000
3202112140,000
42022180,000
52022270,000
※データ型は全てint型とする

この中から、2021年11月〜2022年1月のデータを抽出する例を考える。

正解例:年月を合算した整数に変換する

まずは正解から見ていこう。

SELECT *
FROM tbl_ad_cost
WHERE (year * 100 + month) BETWEEN 202111 AND 202201
;

まず(year * 100 + month)で年月をyyyymm形式の整数に変換し、BETWEEN以降で同じ形式の整数を使って条件指定している。

例えば「year: 2022」「month: 1」で登録されているデータの場合、まず100を掛けることで202200となり、その後に月を足すことで202201となる。

無理やり年月の値を操作して日付型に変換することもできなくはないが、上記のクエリが非常にシンプルでおすすめである。

単純なAND条件による指定だと失敗する。

真っ先に以下のようなクエリが思い浮かぶが、これでは失敗する。

SELECT *
FROM tbl_ad_cost
WHERE year >= 2021 AND year <= 2022 AND month >= 1 AND month <= 11
;

年の指定はこれで良いが、月の指定方法が良くない。

今回のように年またぎの期間指定(2021年11月〜2022年1月)の場合、どうしても条件に矛盾が生じ、うまく抽出することができない。