Access学習メモ 3-12.「3回目の誕生日」

Access学習メモ 3-12.「3回目の誕生日」

コンテンツ
学び
運転免許証(初回グリーン)のように、登録開始日にかかわらず本人の誕生日を基準として(※)、以後の期限満了日を算定するケースがある
「登録してから3回目に訪れる誕生日」を基準とする制度
(3年後≠3回目)

※実際には、運転免許の有効期限は誕生当日でなく誕生日の1か月後
 ややこしい部分は割愛

この場合、登録日が誕生日の前日以前のケースに注意する必要がある
たとえば、ゴジ図書館の一期における利用期間の上限を3年とします

7月25日誕生日の人が7月11日に登録開始した場合
登録3年後の誕生日を算出しただけの下記式では
有効期限が3年後の2029年7月25日となり
実際の利用可能期間が3年を超過してしまう

せっかく計算式を設定しても、ちょっと残念な仕上がり
=DateSerial(Year([登録日])+ 3,Month([誕生日]),Day([誕生日]))

その年の誕生日が到来する前に登録を開始するケースへの対策として
利用期間は3年を上限とするよう制定する必要がある
=DateSerial(Year([登録日]) + IIf(Format([登録日],"mmdd") > Format([誕生日],"mmdd"), 3, 2), Month([誕生日]), Day([誕生日]))

※削除された部分
+ 3,
※追加された部分
+ IIf(Format([登録日],"mmdd") > Format([誕生日],"mmdd"), 3, 2), 

丸3年の利用権を得ることができるのは、誕生日当日に登録開始した人のみ
①誕生日より前に登録した人は登録2年後の誕生日が有効期限
②誕生日より後に登録した人は登録3年後の誕生日が有効期限
①②いずれも2年プラス端数日数が計算結果となる

・・・全然おぼえられないので区切ってみた
フィールド名だけでも([ ])で包む箇所と[]のみでいい箇所に分かれる複雑さ
プログラミング言語って、どうしてこうも
間違えてくれと言わんばかりの構造なのか(੭ु;・∀・)੭ु⁾⁾

・指定した「年・月・日」から日付データを作成
DateSerial(Year([登録日]),Month([誕生日]),Day([誕生日]))
※ここはフィールド名に([])が必要

・条件に合わせて「3」または「2」を、登録日の「年」に加算
 IIf条件式に適合すれば3年、適合しなければ2年
IIf(  ,3,2)
※冒頭の , が抜けないように注意 

・「登録時点で今年の誕生日を過ぎているか」を月日で比較
 登録日が誕生日よりも後(大きい数字)の前提
Format([登録日],"mmdd") > Format([誕生日],"mmdd")
※Format()関数のための()であり、フィールド名は[]のみ

合体させて
DateSerial(Year([登録日])+IIf(Format([登録日],"mmdd")>Format([誕生日],"mmdd"),3,2),Month([誕生日]),Day([誕生日]))

うん、やっぱりおぼえられない

補足:(Null)対策
登録日や誕生日が未入力のレコードが存在する可能性への備え
=IIf(IsNull([登録日]) Or IsNull([誕生日]), Null, DateSerial(Year([登録日]) + IIf(Format([登録日],"mmdd") > Format([誕生日],"mmdd"), 3, 2), Month([誕生日]), Day([誕生日])))


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す