- ベストアンサー
Access2000で質問です
宜しくお願いします 誕生日から年齢計算をするように設定したかったのですが うまくいきません、 半分はうまくいったのですが、、、 マイクロソフトのページを参照して行ったのですが http://support.microsoft.com/intl/japan/personal/default.asp?nav=kl&GSSNB=1 この設定をした後に、誕生日を入力すると、しっかりと年齢に 反映されるのですが、それをもとにしたテーブルに年齢が うまく反映されません、 どなたか宜しくおねがいします、、
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>テーブルに年齢がうまく反映されません これは IIf(Right(Format([誕生日],"yyyy/mm/dd"),5)>Right(Format(Now(),"yyyy/mm/dd"),5),DateDiff("yyyy",[誕生日],Now())-1,DateDiff("yyyy", [誕生日],Now())) で演算した満年齢を表示しているだけなのでテーブルには書込み等の反映はされません。 テーブルに反映させるには記述でUPDATEしに行くか更新クエリでも作って書込みし なければ反映されません。 しかし、ARCさんの言うように年齢は毎日変動する可能性のレコードになりますの で各レコードの生年月日ごとに年齢を更新するよりはフォームやレポートに満年齢 を演算するフィールドを作り記述をした方が良いと思います。ARCさんに同感です。 因みにDateDiffもARCさんの言われるように単純には使いません。 満年齢をすぐ出せないためです。例えば生年月日の月日を見に行き今日の日付の 月日と比較して過ぎているかいないかの記述もネストしなくてはならないので上記 のような記述になります。
その他の回答 (3)
- ARC
- ベストアンサー率46% (643/1383)
生年月日が2000年9月15日だったとして、 ?DateDiff("yyyy",#2000/9/15#,#2002/9/14#) 2 で ?DateDiff("yyyy",#2000/9/15#,#2002/9/16#) 2 です。 DateDiffは満年齢の計算には使えません。
- cafedemocha
- ベストアンサー率29% (232/789)
ややこしい事をされているんですね まぁ、好き好きですから、構いませんけど・・・ DATEDIFF関数ってのがありますので、それを使用して、現在の日付と、誕生日の間の期間を計算させれば、極めて簡単に出ますよ 年齢ってのは、変動する数値ですのでね、固定するテーブルに保存するのであれば、更新クエリーを連動させて、随時更新するようにしておくか、或いは、クエリーや、フォームのコントロールで計算させるかした方が、無難なんですけどね
- ARC
- ベストアンサー率46% (643/1383)
一般に、満年齢をテーブルに保存することはお勧めできません。 なぜなら、満年齢っていうのは毎日変動する要素で、かつ生年月日からいつでも参照可能だからです。 満年齢か絡んでくる処理を非常に頻繁に使用するのでしたら、一日に一度、最初の起動時に再計算をさせてテーブルに保存するのが良いかもしれませんが、そうではないほとんどの場合、データの整合性という見地からするとこのようなことはむしろ好ましくないことなんですよね。 例えばフォームやレポートでしたら、テキストボックスのコントロールソースに満年齢の計算式を記述すると、表示するときに動的に満年齢を計算してくれます。 クエリの場合は、お書きになったURLに回答が書いてありますよね。 満年齢で検索する場合とかは、 満年齢>=16 とする代わりに 誕生日 <= DateSerial(Year(Date())-16,Month(Date()),Day(Date())) ってな感じで代用が利きます。 ↑がわかりにくい(^^; って場合には、 (IIf(Right(Format([誕生日],"yyyy/mm/dd"),5)>Right(Format(Now(),"yyyy/mm/dd"),5),DateDiff("yyyy",[誕生日],Now())-1,DateDiff("yyyy",[誕生日],Now()))) >= 16 とかしてもOK。 ともあれ、どうしてもテーブルに年齢を持たせたいときもあるでしょうから、そんなときは以下のような更新クエリを使えば良いでしょうね。(テーブル名やフィールド名を書き換えた後、SQLビューにして張り付けてください) UPDATE 個人テーブル SET 満年齢 = IIf(Right(Format([誕生日],"yyyy/mm/dd"),5)>Right(Format(Now(),"yyyy/mm/dd"),5),DateDiff("yyyy",[誕生日],Now())-1,DateDiff("yyyy",[誕生日],Now())) WHERE 満年齢<>(IIf(Right(Format([誕生日],"yyyy/mm/dd"),5)>Right(Format(Now(),"yyyy/mm/dd"),5),DateDiff("yyyy",[誕生日],Now())-1,DateDiff("yyyy",[誕生日],Now()))))); で、このクエリを起動時とか、満年齢が必要になる処理の直前とかに実行する、と。 #SQL文とかを実際に検証したわけではないので、「自信なし」です。
お礼
そうだったんですね、 勉強になりました。ご丁寧に 本当にありがとうございました