[pgsql-jp: 26302] Re: 記念日等の範囲検索
Hiroshi Ishiura
issy777 @ entrance-e.com
2002年 6月 6日 (木) 11:37:40 JST
石浦です。
以下ご提示くださった方法がやはり考えられますよね。
なんとなく想像はできていたのですが、よくこういった記念日の範囲指定機能を
装備しているASP等をみかけるのでみなさんどう構築されているのかと興味が
あり質問させてもらいました。
ネックになるのがやはり年情報です。
そう考えると、次いつ誕生日がくるかという判別をもたせる意味あいでphpで処
理をさせてcronでDB更新をする(3)の方法がベストなのでしょうか^^
(1)の方法をとるにしてDB上の年情報の更新は必要ですよね
(2)もやはり同じように。
date型じゃなく月日だけの型で、範囲指定というものができれば別なのですが。
P.S
テーブル名userすいません、例でかいたらつい^^;
実際使ってるテーブル名は、users_dataなので大丈夫です。
> 加藤@川崎です。
>
> > 条件絞り込みで
> > a月b日($s_day)〜c月d日($e_day)の該当者を検索をするとした場合
> > select * from user where memorial_day <= '$e_day' and memorial_day
> > >='$s_day'
> >
> > むりやり年をつけたして検索もできそうなかんじもしたのですが、年をまたぐ指
> > 定の場合(例えば12/20〜1/10までを検索)などどうすればいいのかと。
>
>
> 朝の頭の体操と言うことで、少し考えてみました。手段として、
>
> (1)時期を「月」単位で切ってしまう
> (2)条件判定時にmemorial_dayに年を加えてしまう
> (3)memorial_dayに年情報を加える
>
> の3つの方法が「ぱっ」と思いつきます。
>
>
> (1)時期を「月」単位で切ってしまう
> これは「月」で一度振るいにかけてしまうことで、12/20〜1/10なんて面倒
> 臭い判定を避ける方法です。これは当然思いついていると思います。
>
> これに条件をもう一つ加えて、月を跨ぐ場合には上記条件を二回にわけて
> しまう、、、例えば 12/20〜12/31と1/1〜1/10
>
> クエリをどこから喰わせるのかで $e_day と $s_day の値を算出する方法
> が変わって来ますが、仮に分離した結果判定範囲が
>
> $s_day〜$e1_day
> $s2_day〜$e_day
>
> としたら
>
> select * from user where
> memorial_day between $s_day and $e1_day or
> memorial_day between $s1_day and $e_day;
>
> で良いですよね。(overlapsでもOK)
>
> (2)条件決定時にmemorial_dayに年を加えてしまう
> memorial_dayに今年と来年の「年」情報を条件判定時に加えてしまうもの
> です。ただ「年」情報をどう加えれば良いかは別の方にお願いするとして、 ^^;;
> 年情報を加えたフィールドとして memorial_now memorial_next とでもし
> て($s_dayと$e_dayにも年情報が加わっている)
>
> select * from user where
> memorial_now between $s_day and $e_day or
> memorial_next between $s_day and $e_day;
>
> でいけると思います。(overlapsでもOK)
>
>
> (3)memorial_dayに年情報を加える
> (2)とは memorial_dayの型を初めから date 型(timestamp)にしておくとこ
> ろが異なります。くわえて、cronなどで日に1度(例えば0時に)現在よりも
> 古い日の年情報を更新してしまいます。こうすれば(1)や(2)のように小細
> 工しなくても($s_day/$e_dayともにdateかtimestamp型なら)
>
> select * from user where
> memorial_day between $s_day and $e_day;
>
> で終わりですよね。
>
> 注意点としては、「誕生日」は更新しても「生年月日」は更新してはいけ
> ない、、、そりゃそうですよね。誕生日は毎年やってきますが、生年月日
> は一生で一度ですから。このようにカラムの入力値に依存する関係を忘れ
> て無闇に更新するとDBの意味がなくなったりします。
>
> 聡明な皆さんはともかく、僕なんかは忘れてやってしまいそうです ^^;
>
> こんなところかなぁ? ちなみにクエリ生成をPHPやPerlでやるならゴリゴリで
> きます。が、SQLだけでもっとシンプルかつ聡明な方法ありましたら教えてく
> ださい。^^
> ----
> 加藤@川崎
> お便りは kato @ lantc.cs.fujitsu.co.jp まで
--
Hiroshi Ishiura <issy777 @ entrance-e.com>
pgsql-jp メーリングリストの案内