運転免許証(初回グリーン)のように、登録開始日にかかわらず本人の誕生日を基準として(※)、以後の期限満了日を算定するケースがある
「登録してから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([誕生日])))