[pgsql-jp: 38265] Re: 文字列が日付として有効かをチェックする SQL

KIMURA, Meiji kimura804 @ ybb.ne.jp
2007年 4月 3日 (火) 00:03:47 JST


こんばんわ。木村明治@キムラデービーです。

--- Tamotsu Hasegawa <tamotsu @ nippaku.co.jp> wrote:

> 長谷川@ニッパク です.
> 
> PostgreSQL 8.1.2を利用しています。
> ある文字列が日付として有効かどうかを調べるSQLを作りたいの
> ですが、なかなかうまくいきません。
> 
> とりあえずキャストしてみたのですが、構文エラーになって
> しまいます。
> 
> postgres=# select date( '20070331' );
>     date
> ------------
>  2007-03-31
> (1 row)
> 
> postgres=# select date( 'hoge' );
> ERROR:  invalid input syntax for type date: "hoge"
> postgres=#
> 
> エラーではなく結果として正しいかどうかを取得したいので、
ということであれば、このキャスト自体を手続き型関数として
CREATE FUNCTIONしてやればいいと思います。PostgreSQL 8.0から
例外処理がサポートされたので、キャストして何かエラーが出た
ときには、FALSEを返すような感じです。

CREATE LANGUAGE plpgsqlしてから、以下のストアドプロシージャを作成します。

->ここから
CREATE FUNCTION IS_VALIDDATE(yyyymmdd text) RETURNS boolean as 
$$
DECLARE
	ret boolean;
	query text;
	validdate date;
BEGIN
	query := 'SELECT date(''' || yyyymmdd || ''')';
	EXECUTE query INTO validdate;
	return TRUE;
EXCEPTION
	WHEN OTHERS THEN
	return FALSE;
END;
$$
LANGUAGE PLpgSQL;
<-ここまで

実行結果はこんな感じです。とりあえず、例外はOTHERSということで、全部つかんでしまっていますが。

postgres=# select is_validdate('2007-03-31');
 is_validdate
--------------
 t
(1 row)

postgres=# select is_validdate('2007.03.31');
 is_validdate
--------------
 t
(1 row)

postgres=# select is_validdate('20073h3.31');
 is_validdate
--------------
 f
(1 row)

postgres=# select is_validdate('hoge');
 is_validdate
--------------
 f
(1 row)

postgres=# select is_validdate('20070230');
 is_validdate
--------------
 f
(1 row)

postgres=# select is_validdate(' 20070331');
 is_validdate
--------------
 t
(1 row)

> 古いバージョンのPostgreSQLに対応する必要はありませんが、そもそも
> やり方がスマートではない気がしますし、できれば日付型へのキャストが
> 成功するパターンについて網羅したいのですが、良いアイデアはありませ
> んか?
> ご助言をお願いします。

とりあえずは、これで動作しているような感じなのですが、いかがですか?
PostgreSQL 8.2.3 Windows版で確認しました。

See.
http://www.postgresql.jp/document/pg823doc/html/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING



--
キムラデービー代表 木村明治(KIMURA, Meiji)
http://kimuradb.com
[News] 2007年1月よりDB・開発の低額&定額ミニコンサルやってます!
http://kimuradb.com/miniconsul.html



pgsql-jp メーリングリストの案内