2 返信 最新の回答 日時: Jul 31, 2009 7:42 AM ユーザー:shmz

    日付関数で任意の開始日から○ヶ月後の終了日付を求める方法

    shmz

      タイトル

      日付関数で任意の開始日から○ヶ月後の終了日付を求める方法

      フォーラムに投稿

      日付関数(Date)を使用して任意の開始月から終了日付を求めようと思ってますが、特定の条件では正しく計算されません。

      例えば・・・

       開始日が月末31日付けで終了日が2月末の前日になるような場合

       

      〔例〕開始月:2008年1月31日 期間:13ヶ月 →計算結果は2009年3月2日 となります。

        ※使用関数:Date(Month(開始日)+期間;Day(開始日)-1;Year(開始日))

       

      ちなみに Date(Month(開始日)+月数;0;Year(開始日)+期間) →この場合は期間を年に換算し、1年(期間)と1ヶ月(月数)とています。

           この関数は開始日が1日を想定しているので、Caseで条件を指定し、1日開始と1日以降の開始で関数を組み合わせましたが同様の結果となります。

      ↓条件(Case)+日付関数(Date)

       

       Case(Day(開始日)=1;Date(Month(開始日)+月数;0;Year(開始日)+期間);Day(開始日)>1;Date(Month(開始日)+月数;Day(開始日)-1;Year(開始日)+期間))

       

      上記以外で方法がありましたら教えて頂けますようお願い致します。

      にshmzにより編集されたメッセージ

        • 1. Re: 日付関数で任意の開始日から○ヶ月後の終了日付を求める方法
          YODA
            

          shmz さん、こんにちは。

           

          今回のような場合、開始日が 1 日の場合とそれ以外という分岐ではなく、開始日の日にち(yyyy/mm/ddのdd) - 1 が、終了月の末日を超えているかどうかを判断すれば良いのではないでしょうか。

           

          <参考式1> 

          Case ( Day ( 開始日 ) - 1 > Day ( Date ( Month ( 開始日 ) + 期間 + 1 ; 0 ;  Year (  開始日 ) ) ) ; 

                 Date ( Month ( 開始日 ) + 期間 ; Day ( Date ( Month ( 開始日 ) + 期間 + 1 ; 0 ;  Year (  開始日 ) ) )  -1 ;  Year (  開始日 ) ) ; 

                 Date ( Month ( 開始日 ) + 期間 ; Day ( 開始日 ) -1 ;  Year (  開始日 ) )

           

          上記の式ですと、開始日が1/31で、期間が1ヶ月の方の終了日は 2/27 にできますが、開始日が1/29だった場合、終了日が2/28になり、終了日が逆転する事になります。条件式を加工すればこれを前にずらせますが、終了日の丸めルールについては一考する必要があるかと思います。

           

          なお、定期券などは、このような場合終了月の末日に期限を丸めていると思います。 (2009/1/29〜1/31開始の一ヶ月の定期は、2009/2/28に終了)

           

          <参考式2> 

          Case ( Day ( 開始日 )  -1  ≥ Day ( Date ( Month ( 開始日 ) + 期間 + 1 ; 0 ;  Year (  開始日 ) ) ) ; 

                 Date ( Month ( 開始日 ) + 期間 ; Day ( Date ( Month ( 開始日 ) + 期間 + 1 ; 0 ;  Year (  開始日 ) ) )  ;  Year (  開始日 ) ) ; 

                 Date ( Month ( 開始日 ) + 期間 ; Day ( 開始日 ) -1 ;  Year (  開始日 ) )

          )

           

          終了日の丸めのルールが、ご質問から汲み取れませんでしたが、上記を加工すれば目的の式を作れるのではないでしょうか。

           

          ご参考になれば、幸いです。 

           

          • 2. Re: 日付関数で任意の開始日から○ヶ月後の終了日付を求める方法
            shmz
              

            Yoda様、有難う御座います。

            教えて頂いた関数で問題の解決ができました。

             

            実はレンタル契約書のデータ管理に契約開始日から契約期間を登録し、自動的に契約満了日を求めたかったのですが

            なかなかうまくいきませんでした。最終的にはダミーフィールドを作成し、段階をふんで最終的に正しい値を計算できたんですが・・・

             

            ただ、ダミーフィールドをあまり使用したく無かったので、その関数を繋げたのですが、長くなりすぎて自分でも理解不能に

            なっていたんです。

             

            Yoda様から教えて頂いた2つの関数を使ってテストを行った結果、両方の関数で同じ(正しい)値を取得することができました。

            本当に助かりましたし、非常に勉強になりました。

            有難う御座います。