[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 メーリングリストの案内