今回はPostgreSQLの日付条件を使い、施設の開業日で行を絞り込みます。取得したデータの意味を整理します。
所要時間は15分ほどです。
それでは、さっそく始めていきましょう!
今日のテーマと到達目標
日付・時刻の型を確認し、今回は日付の取得と条件指定を実習しました。指定した日付を含むかどうかに合わせて、条件式を書けることが目標です。
用語の定義
| 用語 | 意味 |
|---|---|
| DATE | 年月日を扱うデータ型。時刻は含まない |
| TIME | 時・分・秒などの時刻を扱うデータ型 |
| TIMESTAMP | 日付と時刻を一緒に扱うデータ型 |
| 日付リテラル | SQLに直接記述する日付の値 |
DATE '2021-01-01'は、2021年1月1日を日付の値として指定する書き方です。今回はDATE型を使い、時刻やタイムゾーンの操作は実習していません。
使用するTableと列
取得元は学習用データを取り込んだmobility.poisです。1行は1施設を表します。
| 列名 | 意味 |
|---|---|
| poi_id | 施設を識別するID |
| poi_name | 施設名 |
| opened_date | 施設の開業日。DATE型 |
開業日を取得する
SELECT poi_id, poi_name, opened_date
FROM mobility.pois
ORDER BY poi_id
LIMIT 5;
実行画面では、施設IDが1から5の行を取得しました。
| poi_id | opened_date |
|---|---|
| 1 | 2021-01-15 |
| 2 | 2019-11-11 |
| 3 | 2022-03-01 |
| 4 | 2021-09-14 |
| 5 | 2019-07-09 |
指定日以降の施設を取得する
次は、各施設の開業日が2021年1月1日と同じか、それより後の行を取得しました。
SELECT poi_id, poi_name, opened_date
FROM mobility.pois
WHERE opened_date >= DATE '2021-01-01'
ORDER BY poi_id
LIMIT 5;
実行結果の施設IDと開業日は次のとおりです。
| poi_id | opened_date |
|---|---|
| 1 | 2021-01-15 |
| 3 | 2022-03-01 |
| 4 | 2021-09-14 |
| 6 | 2021-07-25 |
| 8 | 2024-01-12 |
LIMIT 5で件数を制限しているため、条件に合う施設の総数が5件という意味ではありません。
「より前」と「以前」を書き分ける
自分でSQLを書く演習では、「2021年1月1日より前」を指定する課題に対し、最初は次の条件を書きました。
WHERE opened_date <= DATE '2021-01-01'
SQLは実行できましたが、これは「2021年1月1日以前」です。その日ちょうども含むため、課題の条件と異なります。
そこで、<=を<に修正して再実行しました。
SELECT poi_id, poi_name, opened_date
FROM mobility.pois
WHERE opened_date < DATE '2021-01-01'
ORDER BY poi_id ASC
LIMIT 5;
修正後の実行結果は次のとおりです。
| poi_id | poi_name | opened_date |
|---|---|---|
| 2 | Shinjuku_shopping_002 | 2019-11-11 |
| 5 | Yokohama_office_005 | 2019-07-09 |
| 7 | Omiya_hotel_007 | 2018-01-23 |
| 10 | Shinjuku_shopping_010 | 2020-07-14 |
| 14 | Kawasaki_park_014 | 2019-09-17 |
今回表示された5行は修正前と同じでした。ただし、条件の意味は異なります。表示結果が同じでも、指定日ちょうどの行を含める条件かどうかを確認する必要があります。
別の日付で確認する
最後に、2022年4月1日を使った2問に回答しました。
-- 2022年4月1日以前
WHERE opened_date <= DATE '2022-04-01'
-- 2022年4月1日より後
WHERE opened_date > DATE '2022-04-01'
2問とも正解でした。この2つは条件式を書く確認問題であり、実行結果を確認したSQLではありません。
合格条件と学習記録
| 確認項目 | 確認できた内容 |
|---|---|
| 日付の列を取得できる | opened_dateを含む5行を取得 |
| 日付条件で絞り込める | 2021年1月1日以降の行を取得 |
| 条件の誤りを修正できる | 「より前」の条件を<=から<に修正して実行 |
| 別の日付でも条件を書ける | 「以前」に<=、「より後」に>を指定 |
まとめ
| 指定したい条件 | 演算子 | 指定日ちょうどを含むか |
|---|---|---|
| 以前 | <= | 含む |
| より前 | < | 含まない |
| 以降 | >= | 含む |
| より後 | > | 含まない |
日付条件では、基準の日を含めるかを確認して演算子を選びます。今回のSELECTは取得対象を絞る操作であり、元の開業日を書き換える操作ではありません。