前回の年齢を求める計算式に続いて、今度は「月齢」(月数)、さらに、経過した「年」「月」「日」を求める計算式について考えて見ました。
数え方としては、
H22年4月1日に開始してH23年3月31日に終了であれば、
「12ヶ月」=「1年0ヶ月0日」
H23年9月1日からH23年10月1日なら
「0年1ヶ月1日」
H23年8月10日からH23年9月9日なら
「0年1ヶ月0日」
と数えるようにしてみたい。
とりあえず「G:基準日」というグローバルフィールドを用意して、「Get(日付)」関数で今日の日付が自動的に挿入されるようにセットしておきます。
その上で、「開始日」フィールドと「終了日」フィールドを用意。
以下、あくまで個人的な実験ではありますが。
まずは月齢
月齢は、下記でいいのかなと思います。
「月齢」という計算フィールドを作って、以下の計算式を記入。
Let ( [
%基準日 = If ( IsEmpty ( 終了日 ) ; G:基準日 +1 ; 終了日 +1 ) ;
%開始日 = 開始日
];
( Year ( %基準日 ) * 12 + Month ( %基準日 ) ) - ( Year ( %開始日 ) * 12 + Month ( %開始日 ) )
-
If ( Day ( %基準日 ) < Day ( %開始日 ) ; 1)
)//Let
「基準日」という単語がダブっているので混乱するかもしれません。
「+1」は、日付をこえたら1ヶ月と1日目、という意味です。
端数となる最終月は切り捨て。(うまく表現できないのですが。)
これで通算の月数がでるので、これを12で割れば、商と余りが「年」と「月」です。
つまり、
「年」は Div ( 月齢 ; 12 )
「月」は Mod ( 月齢 ; 12 )
最終月の端数となる日数
ぴったりと月単位で開始終了してくれると楽なのですが、世の中そういうわけには行きません。
1日に入社して翌月の15日退社だと、「1ヶ月と15日」となるわけで、今度はその端数となる日数を求める式です。
Let ( [
%基準日 = If ( IsEmpty ( 終了日 ) ; G:基準日 + 1 ; 終了日 + 1 ) ;
%開始日 = 開始日
];
If (
Day ( %基準日 ) < Day ( %開始日 ) ;
%基準日 - Date ( Month ( %基準日 ) - 1 ; Day ( %開始日 ) ; Year ( %基準日 ) ) ;
Day ( %基準日 ) - Day ( %開始日 )
)//If
)//Let
これで日数まで出るのではないかと思います。
下記の画像は、自分で試してみた結果のスクリーンショットです。
「G:基準日」には「H23年10月1日」と設定して見ました。
つまり「終了日」が空欄であれば、「H23年10月1日」を基準日として計算しています。
とりあえずは、上手く行っているようです。
大丈夫かなあ。
社会保険などの加入月数だと、また少し違う計算になるのだけれども。
間違いがあったら、教えてください。m(__)m