人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: makocan
●カテゴリ:インターネット ウェブ制作
✍キーワード:1981年 1982年 4月 MySQL Perl
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● きゃづみぃ
●25ポイント

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

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

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

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



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

◎質問者からの返答

すみません。

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


2 ● nandedarou
●25ポイント
// 年齢
$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

◎質問者からの返答

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


3 ● chuken_kenkou
●25ポイント

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)
;
◎質問者からの返答

どうもです!


4 ● nandedarou
●25ポイント

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...

◎質問者からの返答

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

解決いたしました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ