どの言語でもそうですが、日付計算は頭を使うことが多く、一回共通でスクリプトを書いたら、二度とそのスクリプトの中身を思い出せなかったりします。
また、練習問題で日付計算をたくさんやった、という方もいらっしゃるかもしれないですね。
そして、今回も「生後」を求める計算を実装したので、覚え書きとして記事にしておきます。
要は、開始と終了の「月」と「日」に注目する、ということです。
開始年月日の月日よりも終了年月日の月日が後の月(例:開始月8月、終了月9月)だった場合や、開始日が終了日よりも後の日(例:開始日10日、終了日1日)をスクリプトに重点的に組み込むのです。
サンプル
いくつかの経過年月日のサンプルを以下に示します。
※from日付:開始年月日、to日付:終了年月日です。
月条件 | 日条件 | 結果 |
---|---|---|
from月 > to月 | from日 > to日 | |
from月 > to月 | from日 < to日 | |
from月 < to月 | from日 < to日 | |
from月 < to月 | from日 > to日 | |
from月 = to月 | from日 < to日 |
今回のサンプルでは、from日付当日は含んでいません。
もし、from当日も含む場合(9/10〜9/11を2日間と計算する場合)は、この経過年月日の日付に1日追加すればいいことになります。
また、from日付とto日付が反対に入っていた場合などのチェックは、フィールドのチェックかスクリプトなどで入れると、さらに確実になります。
計算式
(1)年数、月数、日数を求める準備
月数と日数の場合、先に示したように、fromの方が値が大きかった場合は、意図的に-1(前月)をしてそれぞれの計算で月数を調整します。
(2)fromからtoまでの月数を求め、年数と月数を求める
月数を求める時は、(1)で出した調整分を加味します。
(3)年月よりも多かった分の日数を求める
to日付からfrom日付を引くのですが、そのまま引くと年月も含めた日数になってしまうので、引かれる側をto日付の年月に合わせて(日は、from日付のまま)減算をします。
この時も、(1)で求めた日の調整分を加味し、from日付の月 > to日付の月という場合には前月からの日数にして計算をします。
実装場所
今回は、テーブルの「経過年月日」という計算フィールドに実装しました。
共通部品として切り出す場合は、カスタム関数にすると便利です。
まとめ
経過年月日は、他にも計算方法があると思いますが、今回の計算方法は、割と紙とペンで計算する方法に近いものになっています。
一つの方法として、その他のやり方も探して実装し、どれが効率的か、どれがメンテナンスが楽か、などを見極めて本番へ持っていってくださいね。