perlとMySQLを使って、下記の内容のプログラムを作ろうとしております。


年齢を入れて、DB上にある生年月日と一致したものを取得するシンプルなものなのですが、問題があります。

25歳を入力した場合、1982年の計算になってしまい、4月~2月までの、1981年代生まれの25歳の人間を取得することが出来なくなってしまいます。

DB上に歳データが存在し、生年月日を計算する場合は、月のデータがあるため、楽に出来るのですが、逆はどうすればいいのか分かりません。

どの様なプログラムを作れば宜しいのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/03/15 15:09:04
  • 終了:2007/03/18 03:11:56

回答(4件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982007/03/15 16:04:44

ポイント25pt

この場合、年と月を組み合わせて 範囲指定してあげればいいのです。

開始の年月と 終了の年月を求めてから

開始の年月から 終了の年月までのレコードを抽出するとやったらいいでしょう。

between 値1 and 値2を使ったらいいでしょう。



http://wind-master.dip.jp/soft-info/item/20/catid/4

id:makocan

すみません。

時間が無いため、開始と終了の年月の抽出の仕方もお教えいただけませんでしょうか??

2007/03/15 18:41:45
id:nandedarou No.2

nandedarou回答回数230ベストアンサー獲得回数342007/03/15 17:45:36

ポイント25pt
// 年齢
$nenrei = 25;

//*************************************************************
// 例えば、今日が 2007/3/15 のとき、25歳の人を検索したければ、
// 誕生日が1981/3/16~1982/3/15の人を抽出する。
//*************************************************************

// date関数とmktime関数を組合わせて使用します。
// $from_date = 1981/3/16 で $to_date = 1982/3/15 となるようにする。
$from_date = date( "Y/n/j" ,  mktime(0, 0, 0, date("m"), date("d")+1, date("Y")-$nenrei-1) );
$to_date   = date( "Y/n/j" ,  mktime(0, 0, 0, date("m"), date("d")  , date("Y")-$nenrei  )   );

// SQL文
// テーブル名:MyTable フィールド名:BirthDay の場合
// 次のSQL文を実行すれば、誕生日が$from_date~$to_date
// すなわち、上記の例では、1981/3/16~1982/3/15 のデータが抽出されます。
$sql = sprintf( "SELECT * FROM MyTable WHERE BirthDay >= '%s' AND BirthDay <= '%s';", $from_date, $to_date );

いかがでしょうか?

http://jp2.php.net/manual/ja/function.date.php

http://jp2.php.net/manual/ja/function.mktime.php

id:makocan

すみません。PHPではなく、perlです。。。

2007/03/15 18:42:17
id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542007/03/15 19:36:25

ポイント25pt

http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.h...

set @age=44;

select * from t1
 where c2 between adddate(subdate(curdate(),interval @age+1 year),interval 1 day)
   and subdate(curdate(),interval @age year)
;
id:makocan

どうもです!

2007/03/18 03:11:50
id:nandedarou No.4

nandedarou回答回数230ベストアンサー獲得回数342007/03/16 10:24:21

ポイント25pt

PHPと勘違いしてしまい、申し訳ありません。

回答オープンしてもらえるかわかりませんが、再回答させて頂きます。

各月の末日やうるう年などを考慮する必要があるので、(PHPでは先の回答のように簡単ですが、)perlで実現しようとすると簡単ではなさそうです。


そこで、MySQLの関数で処理する方法を考えました。

$nenrei = 25;
$sql = sprintf( "SELECT * FROM MyTable WHERE BirthDay >= ( (CURDATE() - INTERVAL %d YEAR) + INTERVAL 1 DAY ) AND BirthDay <= (CURDATE() - INTERVAL %d YEAR);", $nenrei+1, $nenrei );

http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.h...

id:makocan

ありがとうございました!

解決いたしました!

2007/03/18 03:11:25

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません