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. アプリケーションが上記のようなデータ型チェックを無視することに基づいている場合、多くの問題が発生します。