PostgreSQL 8.2と8.3の間のTO__DATE関数

PostgreSQL 8.2と8.3の間のTO_DATE関数

PostgreSQL 8.3はデータ型の非常に強力なチェックを行うことを知っているので、PostgreSQL8.xからPostgreSQL8.3への移行後、多くのアプリケーションが多くのデータ型エラーにヒットします。 主にデータ型チェックが原因です。

一般的なエラーの1つはto_date()関数です。 パラメーターとして2つのテキストを受け入れます。

to_date(text,text)

では、次のようにテーブルを作成します。 n_url_testの単純なテーブル呼び出しには、タイムスタンプデータ型としてcreateddateが含まれています。

CREATE TABLE n_url_test
(
  urltestid bigserial NOT NULL,
  createddate timestamp without time zone DEFAULT now(),
  CONSTRAINT n_url_to_test_pkey PRIMARY KEY (urltestid)
)

PostgreSQL8.2で次のsqlを実行すると、期待される結果が「YYYY-MM-DD」形式で返されます。

--PostgreSQL 8.2
---------------
select  to_date(createddate,'YYYY-MM-DD') from n_url_test;

しかし、PostgreSQL8.3に移行した後、次のエラーが発生しました

--PostgreSQL 8.3
---------------
select  to_date(createddate,'YYYY-MM-DD') from n_url_test;

--------------------------------------------------------------------------------
ERROR:  function to_date(timestamp without time zone, unknown) does not exist
LINE 1: select  to_date(createddate,'YYYY-MM-DD') from n_url_test
                ^
HINT:  No function matches the given name and argument types.
You might need to add explicit type casts.

********** Error **********

PostgreSQL 8.3は、以前のバージョンのように、タイムスタンプからテキストに自動的に変換しません。 次のようなcreateddateを明示的に型キャストする必要があります

--PostgreSQL 8.3
---------------
select  to_date(createddate::text,'YYYY-MM-DD') from n_url_test;

::textをcreateddateに追加すると、データ型がテキストとして明示的に変換されます。これで問題ありません。 PostgreSQL8.3 strictly checking on data type is good function , but please do not forget there still have a lot people using previous version. アプリケーションが上記のようなデータ型チェックを無視することに基づいている場合、多くの問題が発生します。