【PostgreSQL】文字列型から日付型に変換する方法を解説!

スポンサーリンク

データベースを扱う際、日付データは非常に重要な要素の一つです。しかし、データの入力や外部システムとの連携の都合上、日付が文字列(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/DDDD-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/DDDD-MM-YYYY など異なるフォーマットの文字列を変換TO_DATE()
文字列が確実に正しい日付形式かわからない場合TO_DATE()
シンプルな変換で高速に処理したい場合::DATE

これで、基本的な STRINGDATE の変換方法を理解できたかと思います!

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:SSYYYY/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 を適切に使い分ける ことで、エラーを防ぎながら効率的に処理できます。

これを機に、自分のデータに最適な方法を試してみてください!

コメント