2014/01/14
PostgreSQL
 >  日付の妥当性を PL/pgSQL でチェック
今日はベンフォードの法則の続きを書く予定を変更し、ちょうど PostgreSQL カテゴリの100番目の記事になるので、初心に返り「単純だけど標準にない」関数を作ってみた。記事タイトルのとおり日付の妥当性をチェックする。実行環境は 2013/12/07 を参照。

チェック対象のデータは、年・月・日の三つの数値などいろいろ考えられるが、今回は簡単に「日付型にキャストする文字列」にする。例えば今日の日付なら 2014-01-14 のように。その文字列を PostgreSQL が日付に変換できれば真、そうでなければ偽を返す。PostgreSQL に妥当な日付の情報が備わっているので、それを使うだけ。

真・偽の分岐は PL/pgSQL の例外処理を使う。渡された文字列を日付型にキャストし、エラーの有無で判定する。下がストアド関数の定義文と、使用例のクエリ。
CREATE OR REPLACE FUNCTION "201401"."14_check_date"(text)
RETURNS bool LANGUAGE plpgsql IMMUTABLE AS $$
BEGIN
PERFORM $1 :: date ;
RETURN TRUE ;
EXCEPTION WHEN OTHERS THEN
RETURN FALSE ;
END ;
$$ ;


結果がやや見づらいが、t が真、f が偽。八桁の数字は自動的に YYYY - MM - DD に解釈され、存在する日付なら真になり、今年の2月29日は存在しないので偽になる。五桁の数字など日付として解釈できない文字列は偽になる。年・月・日が別々の数値の時は、下のように concat_ws 関数でハイフンを挟んで文字列にして渡せばよい。


PL/pgSQL でのエラー捕捉は下記ドキュメントを参照。日本語・英語両方を示す。今日気付いたが、昨年12月5日に出た最新バージョン 9.3.2 の日本語ドキュメントがもう作成・公開されているとは驚き。

PostgreSQL 9.3.2文書 : PL/pgSQL : 制御構造
http://www.postgresql.jp/document/9.3/html/plpgsql-control-structures.html


PostgreSQL 9.3.2 Documentation : PL/pgSQL : Control Structures
http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html


以上、今日は初心に返って「単純だけど標準にない」関数を PL/pgSQL で作った。日付の妥当性をチェックする関数が無いことは、下記ドキュメントで確認した。PostgreSQL の日付/時刻データ型の機能・関数が豊富なので、私が見落としてなければいいが…。

PostgreSQL 9.3.2文書 : 日付/時刻データ型
http://www.postgresql.jp/document/9.3/html/datatype-datetime.html

PostgreSQL 9.3.2文書 : 日付/時刻関数と演算子
http://www.postgresql.jp/document/9.3/html/functions-datetime.html
<< ベンフォードの法則(5)自作関数の…
ベンフォードの法則(4)自作のスト… >>
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。