データベースの世界とフロントエンドの世界では、日付の見せ方について意見が合わないことが多いよね。PostgreSQLはDATE、TIMESTAMP、それにTIMESTAMPTZとして日付を保存できるけど、このままだとユーザーに見せるにはちょっと不便なこともある。例えば、デフォルトの2023-10-01 12:30:45じゃなくて、デザイナーは2023年10月01日 12:30みたいに見せたいかもしれない。レポートやAPI用に日付をフォーマットする必要がある場面もあるよ。
PostgreSQLで日付を文字列に変換したり、逆に文字列から日付に戻したりするにはTO_CHAR()とTO_DATE()関数を使うんだ。
TO_CHAR()関数
TO_CHAR()は、日付やタイムスタンプを人間が読みやすい文字列に変換したいときの最強の味方。日付やタイムスタンプを受け取って、指定したフォーマットで文字列にしてくれるよ。
シンタックス
TO_CHAR(value, format)
value— 変換したい日付やタイムスタンプ。format— どんなふうに日付を表示したいかのフォーマットテンプレート文字列。
フォーマット例
| フォーマットテンプレート | 意味 | 例 |
|---|---|---|
YYYY |
年 | 2023 |
MM |
月(01〜12の数字) | 10 |
MONTH |
月の名前(大文字) | OCTOBER |
DAY |
曜日名(大文字) | SUNDAY |
DD |
日 | 01 |
HH24 |
24時間表記の時 | 15 |
MI |
分 | 45 |
SS |
秒 | 30 |
フォーマットの全リストはPostgreSQL公式ドキュメントでチェックできるよ。
TO_CHAR()の使い方例
レポート用に日付をフォーマット
SELECT TO_CHAR(NOW(), 'DD.MM.YYYY') AS formatted_date;
-- 結果: '09.10.2023'
12時間表記で時刻を表示
SELECT TO_CHAR(NOW(), 'HH12:MI AM') AS formatted_time;
-- 結果: '03:45 PM'
月を文字で出力
SELECT TO_CHAR(NOW(), 'Month') AS month_name;
-- 結果: 'October '
注意:PostgreSQLは最後にスペースを付けるよ。これは仕様!スペースを消したいならTRIM()関数を使おう:
SELECT TRIM(TO_CHAR(NOW(), 'Month')) AS trimmed_month_name;
カスタムフォーマットを作る
SELECT TO_CHAR(NOW(), 'YYYY/MM/DD HH24:MI:SS') AS custom_format;
-- 結果: '2023/10/09 15:45:30'
ユーザー向けに日付をフォーマット
SELECT TO_CHAR(NOW(), 'DD "月" YYYY年') AS user_friendly_date;
-- 結果: '09 月 2023年'
TO_DATE()関数
TO_DATE()は逆の役割:文字列をDATE型に変換する。なんで必要?例えば、ユーザーが01-10-2023みたいなフォーマットで日付を入力したとき、PostgreSQLがそれを正しく「理解」するためだよ。
シンタックス
TO_DATE(value, format)
value— 日付が入った文字列。format— その文字列がどんなフォーマットかを説明するテンプレート文字列。
TO_DATE()の使い方例
文字列を日付に変換
SELECT TO_DATE('01-10-2023', 'DD-MM-YYYY') AS date_value;
-- 結果: '2023-10-01'(データ型: DATE)
文字列の日付とテーブルの日付を比較
例えば、appointmentsテーブルにappointment_date(型はDATE)カラムがあるとする。ユーザーが文字列で日付を入力した場合:
SELECT *
FROM appointments
WHERE appointment_date = TO_DATE('2023-10-09', 'YYYY-MM-DD');
フォーマットミス
注意:文字列のフォーマットがテンプレートと合ってないとエラーになる!例えば:
SELECT TO_DATE('01/10/2023', 'DD-MM-YYYY');
-- エラー: 入力フォーマットが正しくない
ユーザー入力のチェック
例えば、注文を保存するテーブルを作って、日付をユーザーが入力する場合:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date DATE
);
-- 文字列を日付に変換してデータを挿入
INSERT INTO orders (order_date)
VALUES (TO_DATE('10-09-2023', 'MM-DD-YYYY'));
実践例
レポートのフォーマット。 salesテーブルにsale_date(型はTIMESTAMP)カラムがあるとする。日付をDD.MM.YYYY形式でレポートに出したい場合:
-- サンプルデータ
CREATE TABLE sales (
sale_id SERIAL PRIMARY KEY,
sale_date TIMESTAMP
);
INSERT INTO sales (sale_date)
VALUES
('2023-10-01 15:30:00'),
('2023-10-02 10:15:00'),
('2023-10-03 12:45:00');
-- レポート
SELECT sale_id,
TO_CHAR(sale_date, 'DD.MM.YYYY') AS formatted_date
FROM sales;
ユーザー入力データの変換。 ユーザーがMM/DD/YYYY形式で日付を入力した場合、それをDATE型に変換して保存したいとき:
INSERT INTO sales (sale_date)
VALUES (TO_TIMESTAMP('10/01/2023 15:30:00', 'MM/DD/YYYY HH24:MI:SS'));
よくあるミスとアドバイス
フォーマットミス。よくあるのは、文字列のフォーマットとテンプレートが合ってないパターン。例えば、ユーザーが01-10-2023と入力したのに、フォーマットがMM/DD/YYYYだとPostgreSQLはエラーを返す。アドバイス:SQLに渡す前にユーザー入力を必ずバリデーションしよう。
TO_CHAR()のスペース問題。MONTHみたいなフォーマットはスペースが付くことがある。気になるならTRIM()関数を使おう。
文字列パース時のエラー。文字列に予期しない文字やフォーマットがあると、PostgreSQLは変換できない。アドバイス:正規表現や追加のデータチェックを使って、DBに入れる前に確認しよう。
時間フォーマットの使い方ミス。例えば、TIMESTAMPにDATE用のテンプレートを使おうとすると失敗する。アドバイス:使うデータ型が目的に合ってるかちゃんと確認しよう。
TO_CHAR()とTO_DATE()は、日付データを扱う上でめっちゃ便利。レポート用のフォーマットを作ったり、ユーザー入力を変換したり、SQLクエリを読みやすくしたりできる。実際の現場でも、データの可視化やレポート作成、他システムとの連携、UIの準備などでよく使われてるよ。
GO TO FULL VERSION