SQLデータベースの世界において、PostgreSQLはその堅牢性と豊富な機能で広く知られています。その機能の1つが、日付型やタイムスタンプ型の強力なサポートです。このガイドでは、PostgreSQLで日付をフォーマットする方法をコードサンプルとともに解説します。このチュートリアルは、PostgreSQLの知識を広げたいソフトウェアエンジニアや技術に詳しい方を対象としています。
PostgreSQLの日付を理解する
日付のフォーマット方法に入る前に、PostgreSQLで日付がどのように表現されるかを理解しておくことが重要です。PostgreSQLでは日付の保存に「Date」データ型を使用します。DATE列を持つテーブルは次のように作成します。
CREATE TABLE orders (
order_id serial PRIMARY KEY,
order_date DATE NOT NULL
);
では、ordersテーブルにデータを挿入してみましょう。
INSERT INTO orders (order_date) VALUES
('2022-04-01'),
('2022-04-02'),
('2022-04-03');
PostgreSQLは賢いので、ISO 6801形式で日付を指定すれば、文字列から日付を判別してくれます。
PostgreSQLで日付をフォーマットする方法: TO_CHAR関数の使用
PostgreSQLで日付をフォーマットする主な方法は、TO_CHAR関数を使うことです。TO_CHARを使うと、日付/時刻型を特定のパターンの文字列にフォーマットできます。使い方は次のとおりです:
TO_CHAR(date, format)
フォーマット文字列オプションの完全な一覧はPostgreSQLのドキュメントで確認できます。2024年1月時点のフォーマットオプションは以下のとおりです:
| パターン | 説明 |
|---|---|
| HH | 時(01–12) |
| HH12 | 時(01–12) |
| HH24 | 時(00–23) |
| MI | 分(00–59) |
| SS | 秒(00–59) |
| MS | ミリ秒(000–999) |
| US | マイクロ秒(000000–999999) |
| FF1 | 10分の1秒(0–9) |
| FF2 | 100分の1秒(00–99) |
| FF3 | ミリ秒(000–999) |
| FF4 | 10分の1ミリ秒(0000–9999) |
| FF5 | 100分の1ミリ秒(00000–99999) |
| FF6 | マイクロ秒(000000–999999) |
| SSSS, SSSSS | 午前0時からの経過秒数(0–86399) |
| AM, am, PM or pm | 午前/午後の表示(ピリオドなし) |
| A.M., a.m., P.M. or p.m. | 午前/午後の表示(ピリオドあり) |
| Y,YYY | カンマ付きの年(4桁以上) |
| YYYY | 年(4桁以上) |
| YYY | 年の下3桁 |
| YY | 年の下2桁 |
| Y | 年の下1桁 |
| IYYY | ISO 8601週番号年(4桁以上) |
| IYY | ISO 8601週番号年の下3桁 |
| IY | ISO 8601週番号年の下2桁 |
| I | ISO 8601週番号年の下1桁 |
| BC, bc, AD or ad | 紀元の表示(ピリオドなし) |
| B.C., b.c., A.D. or a.d. | 紀元の表示(ピリオドあり) |
| MONTH | 大文字の月名(9文字まで空白埋め) |
| Month | 先頭大文字の月名(9文字まで空白埋め) |
| month | 小文字の月名(9文字まで空白埋め) |
| MON | 大文字の月名の省略形(英語では3文字、ロケールにより長さは異なります) |
| Mon | 先頭大文字の月名の省略形(英語では3文字、ロケールにより長さは異なります) |
| mon | 小文字の月名の省略形(英語では3文字、ロケールにより長さは異なります) |
| MM | 月の番号(01–12) |
| DAY | 大文字の曜日名(9文字まで空白埋め) |
| Day | 先頭大文字の曜日名(9文字まで空白埋め) |
| day | 小文字の曜日名(9文字まで空白埋め) |
| DY | 大文字の曜日名の省略形(英語では3文字、ロケールにより長さは異なります) |
| Dy | 先頭大文字の曜日名の省略形(英語では3文字、ロケールにより長さは異なります) |
| dy | 小文字の曜日名の省略形(英語では3文字、ロケールにより長さは異なります) |
| DDD | 年間通算日(001–366) |
| IDDD | ISO 8601週番号年の通算日(001–371。年の1日目は最初のISO週の月曜日) |
| DD | 日(01–31) |
| D | 曜日。日曜日(1)から土曜日(7) |
| ID | ISO 8601の曜日。月曜日(1)から日曜日(7) |
| W | 月の週番号(1–5)(第1週は月の初日から始まります) |
| WW | 年の週番号(1–53)(第1週は年の初日から始まります) |
| IW | ISO 8601週番号年の週番号(01–53。年の最初の木曜日が第1週に含まれます) |
| CC | 世紀(2桁)(21世紀は2001-01-01から始まります) |
| J | ユリウス日(紀元前4714年11月24日の現地時間午前0時からの整数日数。セクションB.7を参照) |
| Q | 四半期 |
| RM | 大文字のローマ数字による月(I–XII。I=1月) |
| rm | 小文字のローマ数字による月(i–xii。i=1月) |
| TZ | 大文字のタイムゾーン略称(to_charでのみサポート) |
| tz | 小文字のタイムゾーン略称(to_charでのみサポート) |
| TZH | タイムゾーンの時間 |
| TZM | タイムゾーンの分 |
| OF | UTCからのタイムゾーンオフセット(to_charでのみサポート) |
日付フォーマットの例
まずは日付をシンプルで読みやすい文字列に変換してみましょう。方法は次のとおりです:
SELECT order_id, TO_CHAR(order_date, 'DD Mon YYYY') as formatted_date
FROM orders;
出力は次のようになります:
order_id | formatted_date
———+—————-
1 | 13 Jan 2024
2 | 12 Jan 2024
3 | 11 Jan 2024
4 | 10 Jan 2024
5 | 09 Jan 2024
日付の一部だけを抽出することもできます:
SELECT order_id, TO_CHAR(order_date, 'Day') as day_of_week
FROM orders;
order_id | day_of_week
———+————-
1 | Friday
2 | Thursday
3 | Wednesday
4 | Tuesday
5 | Monday
必要に応じてフォーマットを組み合わせることもできます:
SELECT order_id, TO_CHAR(order_date, 'Day, DD Mon YYYY') as detailed_date
FROM orders;
order_id | detailed_date
———+————————
1 | Friday, 13 Jan 2024
2 | Thursday, 12 Jan 2024
3 | Wednesday, 11 Jan 2024
4 | Tuesday, 10 Jan 2024
5 | Monday, 09 Jan 2024
EXTRACT関数
EXTRACT関数を使うと、年、月、日など、日付/時刻値のあらゆる部分に簡単にアクセスできます。
SELECT order_id, EXTRACT(MONTH from order_date) as order_month
FROM orders;
order_id | order_month
———+————
1 | 1
2 | 1
3 | 1
4 | 1
5 | 1
以上がPostgreSQLにおける日付フォーマットの基本です。これらのツールは、日付データを扱うための確かな基礎となるはずです。プログラミングの何事も同じですが、練習が鍵です。ぜひ実際にこれらのコマンドを試して、他にどんなことができるか探ってみてください。Happy coding!
これらのクエリはぜひBeekeeper Studioで実行してみてください。:-)
Beekeeper Studioは無料のオープンソースのデータベースGUIです
これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。
Beekeeper Studio利用者の声
「Beekeeper Studioで以前のSQLワークフローを完全に置き換えました。高速で直感的で、データベース作業が再び楽しくなりました。」
「多くのデータベースGUIを試してきましたが、Beekeeperは機能とシンプルさのバランスが完璧です。とにかくちゃんと動きます。」