今回はPostgreSQLのBETWEENを使い、開業日が指定した範囲に入る施設を取得します。取得したデータの意味を整理します。
所要時間は15分ほどです。
それでは、さっそく始めていきましょう!
今日のテーマと到達目標
日付の範囲を自分で指定し、BETWEENと比較演算子による条件の関係を説明することが目標です。
用語の定義
| 用語 | 意味 |
|---|---|
| 下限 | 指定する範囲の始まりの値 |
| 上限 | 指定する範囲の終わりの値 |
| BETWEEN 下限 AND 上限 | 下限以上、上限以下に入るかを判定する指定 |
BETWEENは下限と上限の両方を含みます。BETWEEN内のANDは、下限と上限を区切るために使います。
取得元はmobility.poisです。1行は1施設を表します。poi_idは施設ID、poi_nameは施設名、opened_dateはDATE型の開業日です。
2021年中に開業した施設を取得する
SELECT poi_id, poi_name, opened_date
FROM mobility.pois
WHERE opened_date BETWEEN DATE '2021-01-01'
AND DATE '2021-12-31'
ORDER BY poi_id;
このSQLを実行し、13施設を取得しました。実行画面の施設IDと開業日は次のとおりです。
| poi_id | opened_date |
|---|---|
| 1 | 2021-01-15 |
| 4 | 2021-09-14 |
| 6 | 2021-07-25 |
| 11 | 2021-03-10 |
| 12 | 2021-06-06 |
| 17 | 2021-02-09 |
| 24 | 2021-12-25 |
| 26 | 2021-02-11 |
| 33 | 2021-09-07 |
| 36 | 2021-01-28 |
| 57 | 2021-07-16 |
| 63 | 2021-03-28 |
| 64 | 2021-01-06 |
「2021年12月31日ちょうどに開業した施設も条件に含まれるか」という質問には、「含まれる」と回答しました。上限を含むので正解です。これは条件の意味の確認であり、その日に開業した施設が実際の結果に存在するという意味ではありません。
自分で期間を指定する演習
次は、2022年1月1日から2023年12月31日までを指定するSQLを自分で書きました。
SELECT poi_id, poi_name, opened_date
FROM mobility.pois
WHERE opened_date BETWEEN DATE '2022-01-01'
AND DATE '2023-12-31'
ORDER BY poi_id;
実行結果は18行でした。
| poi_id | opened_date |
|---|---|
| 3 | 2022-03-01 |
| 16 | 2022-04-18 |
| 18 | 2023-04-24 |
| 22 | 2023-04-17 |
| 27 | 2023-07-01 |
| 28 | 2022-11-19 |
| 29 | 2023-03-25 |
| 31 | 2022-03-13 |
| 32 | 2022-12-16 |
| 35 | 2023-05-15 |
| 37 | 2023-04-13 |
| 38 | 2023-04-24 |
| 45 | 2023-10-16 |
| 48 | 2023-09-02 |
| 50 | 2023-03-25 |
| 51 | 2023-03-12 |
| 56 | 2022-04-03 |
| 60 | 2023-11-13 |
件数を制限していないため、今回のデータで指定した期間に開業した施設は18件と確認できます。
比較演算子とANDで書き換える
同じ条件を、BETWEENを使わずに書き換えて実行しました。
SELECT poi_id, poi_name, opened_date
FROM mobility.pois
WHERE (opened_date >= DATE '2022-01-01')
AND (opened_date <= DATE '2023-12-31')
ORDER BY poi_id;
こちらも同じ18施設が、同じ施設IDの順序で返りました。条件式の回答だけでなく、両方の実行結果を確認できました。
| 部分 | 指定している内容 |
|---|---|
| opened_date >= DATE '2022-01-01' | 開業日が下限と同じか、それより後 |
| opened_date <= DATE '2023-12-31' | 開業日が上限と同じか、それより前 |
| AND | 上の2条件の両方を満たす |
BETWEENは、今回のような両端を含む範囲条件をまとめて書く方法です。
入力途中で書き直したいとき
演習中に、誤って入力した後に改行した場合のリセット方法も確認しました。
psqlでは、まだ実行していない入力を消すために次を使います。
\r
引用符の入力途中などでコマンドとして認識されない場合は、Control+Cで入力を中断して書き直せます。これらは実行済みのSQLを取り消す操作ではありません。
このリセット操作は説明を受けた内容であり、今回の画像で実行を確認したものではありません。
合格条件と学習記録
| 確認項目 | 確認できた内容 |
|---|---|
| BETWEENで日付の範囲を指定できる | 2021年中の13施設を取得 |
| 境界の日付を含むことを理解できる | 上限の12月31日も含まれると回答 |
| 自分で範囲を変更できる | 2022年から2023年の18施設を取得 |
| 比較演算子で書き換えられる | >=、<=、ANDを使い、同じ18施設を取得 |
共有された演習SQLは正常に実行できました。
まとめ
BETWEEN 下限 AND 上限は両端を含む範囲指定です。今回のDATE型の条件では、>= 下限 AND <= 上限と同じ意味で使えます。日付の範囲を指定するときは、境界の日を含めたいかを確認します。