More info...

2008-11-19

Is it a holiday?

オトコたるものどのよう変化にも柔軟に対応しなければならない。

法律が改正されてしまったせいで、祝日の判定がとても面倒臭いことになってしまっている今日この頃である。祝日の判定は、一般的にはアプリケーションのレベルでおこなわれる場合が多いが、祝日の日付は年によって違うし随時変更される可能性があり、もしも日付のデータをハードコードなどしてしまっているような日には祝日の日程が発表されるたびにアプリケーションを書き換えないといけないという羽目になってしまうから最悪である。祝日のデータも一極集中的にデータベースで管理すると良いかも知れないが、その実装方法がマチマチであったりすると、どこにどのようにして祝日のデータを反映させなければいけないのかという管理が大変になり、結局は運用面の手間はそれほど変わらないということになる。

そこで、そのような問題を解消すべく、とてもシンプルな祝日判定関数をMySQLの拡張関数として作成してみた。MySQL Community Server 5.0.67向けのパッチを以下のページに置いたので試してみて欲しい。パッチのライセンスはもちろんGPLv2である。
http://www.mysqlpracticewiki.com/files/mysql-5.0.67-holidaymod-patch

パッチ適用方法

shell> tar zxf mysql-5.0.67.tar.gz
shell> patch -p2 -d mysql-5.0.67  < mysql-5.0.67-holidaymod-patch

パッチを適用した後には通常通りビルドすればOKだ。

使い方。

まず、MySQLサーバを起動して、mysql.holidayというテーブルに祝日のデータを入力する。

2008年と2009年の祝日データは以下のページにあるのでダウンロードして欲しい。
http://www.mysqlpracticewiki.com/files/holiday_2008-2009.sql

shell> mysql mysql < holiday_2008-2009.sql

そしてMySQLサーバを再起動すると、次のように関数を実行することが出来る。

mysql> select isholiday('2009-11-3');
+------------------------+
| isholiday('2009-11-3') |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

mysql> select holidayname('20091103');
+-------------------------+
| holidayname('20091103') |
+-------------------------+
| 文化の日            |
+-------------------------+
1 row in set (0.00 sec)

ISHOLIDAY()関数は日付を引数としてとり、
  • 祝日の場合には1
  • 祝日でない場合には0
  • 無効な日付の場合にはNULL
を返す仕組みになっている。日付の書式はMySQLが認識出来る形式なら何でも良い。

また、HOLIDAYNAME()関数は日付を引数としてとり、日付の名前を返す仕組みになっている。

祝日のデータを更新する場合には、mysql.holidayテーブルを更新して、MySQLを再起動すれば良い。運用も楽ちんである。

祝日判定ロジックの実装は面倒だし祝日データの更新が面倒だ!という方は是非試して頂きたい。皆さんからのフィードバックを絶賛受付中である!!

0 件のコメント:

コメントを投稿