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

Tamotsu Hasegawa tamotsu @ nippaku.co.jp
2007年 4月 1日 (日) 01:49:48 JST


長谷川@ニッパク です.

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=#

エラーではなく結果として正しいかどうかを取得したいので、
色々と考えた結果、to_date関数で変換してから十分に古い日付と
比較する方法で試してみました。

postgres=# select to_date('2007 03 31', 'YYYY MM DD') > date( '100-01-01' )
as result;
 result
--------
 t
(1 row)

postgres=# select to_date('2007/03/31', 'YYYY MM DD') > date( '100-01-01' )
as result;
 result
--------
 t
(1 row)

postgres=# select to_date('2007-03-31', 'YYYY MM DD') > date( '100-01-01' )
as result;
 result
--------
 t
(1 row)

postgres=# select to_date('2007.03.31', 'YYYY MM DD') > date( '100-01-01' )
as result;
 result
--------
 t
(1 row)

postgres=# select to_date('2007#03#31', 'YYYY MM DD') > date( '100-01-01' )
as result;
 result
--------
 t
(1 row)

postgres=# select to_date('20070331', 'YYYY MM DD') > date( '100-01-01' )
as result;
 result
--------
 f
(1 row)

postgres=#

一見良さそうなのですが、最後の'20070331'がfalseになってしまいます。
また、古いバージョンでは先頭に空白が入ると変換結果が予想外な値に
なるようです。

postgres=# select version();
                               version
----------------------------------------------------------------------
 PostgreSQL 7.4.6 on i386-unknown-freebsd4.10, compiled by GCC 2.95.4
(1 row)

postgres=# select to_date(' 2007-03-31', 'YYYY-MM-DD');
  to_date
------------
 2175-01-26
(1 row)

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

/* 長谷川 保 @ (株)ニッパク */




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