データベースを扱う際、日付データは非常に重要な要素の一つです。しかし、データの入力や外部システムとの連携の都合上、日付が文字列(STRING
型)として保存されることがあります。このような場合、適切なフォーマットで DATE
型に変換しないと、日付の計算やフィルタリングができず、不便な状況に陥ります。
本記事では、PostgreSQL において STRING
型のデータを DATE
型に変換する方法をわかりやすく解説します。基本的な TO_DATE()
関数の使い方から、異なるフォーマットの文字列を適切に処理する方法まで幅広く紹介します。
本記事の対象読者は以下のような方々です。
- PostgreSQL を使ってデータベースを運用している方
- 文字列として保存された日付を
DATE
型に変換したい方 - 変換時のエラーを防ぐためのベストプラクティスを知りたい方
それでは、具体的な方法を見ていきましょう!
文字列を日付に変換する方法
PostgreSQL では、STRING
型のデータを DATE
型に変換する方法として、主に TO_DATE()
関数 と ::DATE
キャスト の 2 つの手法が利用できます。それぞれの使い方を詳しく見ていきましょう。
TO_DATE()関数を使う
TO_DATE()
は、指定したフォーマットに従って文字列を DATE
型に変換する関数です。
基本構文は以下の通りです。
TO_DATE(text, format)
text
変換対象の文字列format
日付のフォーマット(YYYY-MM-DD
など)
使用例
SELECT TO_DATE('2025-02-07', 'YYYY-MM-DD');
実行結果
to_date
------------
2025-02-07
(1 row)
このように、'2025-02-07'
という文字列を DATE
型に変換できます。
もし YYYY/MM/DD
の形式で日付が保存されている場合は、次のように変換できます。
SELECT TO_DATE('2025/02/07', 'YYYY/MM/DD');
また、DD-MM-YYYY
のような形式で保存されている場合は、
SELECT TO_DATE('07-02-2025', 'DD-MM-YYYY');
このように、TO_DATE()
を使うことで、さまざまな形式の文字列を正しく DATE
型に変換できます。
::DATE キャストを使う
もう一つの方法として、文字列を ::DATE
でキャストする方法があります。
これは、特に 標準的な日付フォーマット (YYYY-MM-DD
) の文字列に適用できるシンプルな方法 です。
使用例
SELECT '2025-02-07'::DATE;
実行結果
date
------------
2025-02-07
(1 row)
この方法は TO_DATE()
よりもシンプルですが、 異なるフォーマットの文字列(例: YYYY/MM/DD
や DD-MM-YYYY
)には対応していない ため、フォーマットが統一されている場合のみ有効です。
例えば、次のようなクエリではエラーとなります。
SELECT '07-02-2025'::DATE;
ERROR: invalid input syntax for type date: "07-02-2025"
この場合は TO_DATE('07-02-2025', 'DD-MM-YYYY')
を使う必要があります。
どちらを使うべき?
ケース | 推奨される方法 |
---|---|
YYYY-MM-DD 形式の文字列を変換 | ::DATE |
YYYY/MM/DD や DD-MM-YYYY など異なるフォーマットの文字列を変換 | TO_DATE() |
文字列が確実に正しい日付形式かわからない場合 | TO_DATE() |
シンプルな変換で高速に処理したい場合 | ::DATE |
これで、基本的な STRING
→ DATE
の変換方法を理解できたかと思います!
STRING型からTIMESTAMP 型に変換する場合
文字列 (STRING
) を DATE
型に変換する方法を紹介しましたが、実際のデータベースでは 日時情報 (TIMESTAMP
) を扱うケース も多くあります。
PostgreSQL では、文字列を TIMESTAMP
型に変換する方法として、主に TO_TIMESTAMP()
関数 と ::TIMESTAMP
キャスト の 2 つの手法が利用できます。それぞれの使い方を見ていきましょう。
TO_TIMESTAMP() 関数を使う
TO_TIMESTAMP()
は、指定したフォーマットに従って文字列を TIMESTAMP
型に変換する関数です。
基本構文は以下の通りです。
TO_TIMESTAMP(text, format);
text
変換対象の文字列format
日付のフォーマット(YYYY-MM-DD HH24:MI:SS
など)
使用例
SELECT TO_TIMESTAMP('2025-02-07 14:30:00', 'YYYY-MM-DD HH24:MI:SS');
実行結果
to_timestamp
------------------------
2025-02-07 14:30:00+00
(1 row)
このように、YYYY-MM-DD HH24:MI:SS
形式の文字列を TIMESTAMP
型に変換できます。
::TIMESTAMP キャストを使う
もう一つの方法として、文字列を ::TIMESTAMP
でキャストする方法があります。
これは、特に 標準的な日付時刻フォーマット (YYYY-MM-DD HH:MI:SS
) の文字列に適用できるシンプルな方法 です。
使用例
SELECT '2025-02-07 14:30:00'::TIMESTAMP;
実行結果
timestamp
------------------------
2025-02-07 14:30:00
(1 row)
この方法は TO_TIMESTAMP()
よりもシンプルですが、 異なるフォーマットの文字列(例: DD-MM-YYYY HH:MI:SS
)には対応していない ため、フォーマットが統一されている場合のみ有効です。
例えば、次のようなクエリはエラーになります。
SELECT '07-02-2025 14:30:00'::TIMESTAMP;
ERROR: invalid input syntax for type timestamp: "07-02-2025 14:30:00"
この場合は TO_TIMESTAMP('07-02-2025 14:30:00', 'DD-MM-YYYY HH24:MI:SS')
を使う必要があります。
どちらを使うべき?
ケース | 推奨される方法 |
---|---|
YYYY-MM-DD HH:MI:SS 形式の文字列を変換 | ::TIMESTAMP |
DD-MM-YYYY HH:MI:SS や YYYY/MM/DD HH12:MI:SS AM など異なるフォーマットの文字列を変換 | TO_TIMESTAMP() |
文字列が確実に正しい日時形式かわからない場合 | TO_TIMESTAMP() |
シンプルな変換で高速に処理したい場合 | ::TIMESTAMP |
DATE
型と TIMESTAMP
型の違いを理解し、適切な方法を選択することが重要です。
まとめ
本記事では、PostgreSQL における STRING
型のデータを DATE
型や TIMESTAMP
型に変換する方法 について解説しました。
PostgreSQL では、STRING
型のデータを適切な DATE
または TIMESTAMP
に変換することで、データの正規化や検索・計算の利便性が向上 します。
データの形式に応じて TO_DATE()
や TO_TIMESTAMP()
、::DATE
や ::TIMESTAMP
を適切に使い分ける ことで、エラーを防ぎながら効率的に処理できます。
これを機に、自分のデータに最適な方法を試してみてください!
コメント