- ベストアンサー
ACCESSで年数と日付の間隔の算出
はじめて質問します。 ACCESS2000を使用しています。 DataDiffを使用して[終了年月日]から[開始年月日]の間の、 年数と月数を求めたいのですが。(3年4ヶ月などというように) 1月31日から2月1日とした時に1月とされてしまう点や、負の数が返されてしまう点を改善したいのですが。 宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
No.1 下記に訂正。 Option Explicit Public Function GetDateDiffFormatString(ByVal dtmStart As Date, ByVal dtmEnd As Date) As String Dim strRet As String Dim intYear As Integer Dim intMonth As Integer Dim intDay As Integer intYear = DateDiff("yyyy", dtmStart, dtmEnd) intMonth = DateDiff("m", dtmStart, dtmEnd) If (Day(dtmStart) > Day(dtmEnd)) And (Not IsEndOfMonth(dtmEnd)) Then intMonth = intMonth - 1 End If If intMonth >= 12 Then intMonth = intMonth Mod 12 End If If DateSerial(Year(dtmEnd), Month(dtmStart), Day(dtmStart)) _ > DateSerial(Year(dtmEnd), Month(dtmEnd), Day(dtmEnd)) Then intYear = intYear - 1 End If If Day(dtmStart) <= Day(dtmEnd) Then If IsEndOfMonth(dtmStart) Then intDay = 0 Else intDay = Day(dtmEnd) - Day(dtmStart) End If Else If IsEndOfMonth(dtmEnd) Then intDay = DateDiff("d", dtmStart, GetEndOfMonth(dtmStart)) Else intDay = DateDiff("d", dtmStart, GetEndOfMonth(dtmStart)) _ + DateDiff("d", GetStartOfMonth(dtmEnd), dtmEnd) + 1 End If End If If intYear <> 0 Then strRet = CStr(intYear) & "年" End If If intMonth <> 0 Then strRet = strRet & CStr(intMonth) & "月" End If If intDay <> 0 Then strRet = strRet & CStr(intDay) & "日" End If GetDateDiffFormatString = strRet End Function Public Function IsEndOfMonth(ByVal dtmSource As Date) As Boolean '月末日であるかどうかを判定。 IsEndOfMonth = (dtmSource = GetEndOfMonth(dtmSource)) End Function Public Function GetEndOfMonth(ByVal dtmSource As Date) As Date '月末日を求める。 GetEndOfMonth = DateSerial(Year(dtmSource), Month(dtmSource) + 1, 0) End Function Public Function GetStartOfMonth(ByVal dtmSource As Date) As Date '月初を求める。 GetStartOfMonth = DateSerial(Year(dtmSource), Month(dtmSource), 1) End Function
その他の回答 (2)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>年数と月数を求めたいのですが。(3年4ヶ月などというように) これについては単純に月でDateDiffを呼んで、12で割って商と余りを求めれば1発でしょう。 >> 1月31日から2月1日とした時に1月とされてしまう点や、 >負の数が返されてしまう点を改善したい 1ヶ月と数えられるのは仕様なんですけどねぇ。 2-1なんですから。 それに文句をつけちゃなんにもできませんよ。 対応するにゃ終了日に1日足せばいいじゃないですか。 負の数だって、数学的に考えて絶対値を取れば何にも問題ないんじゃないですか? Abs()でできますよね。
お礼
すいませんでした。 初心者なもので考えが浮かばず・・・ 参考になりました! 本当にありがとうございました。
> 1月31日から2月1日とした時に1月とされてしまう点や、負の数が返されてしまう点を改善したい 一例ですが、下記の要領で。 # 日付の前後 ( 大小 ) 関係が逆転する場合の対応は、例外を発生させるか、引数を入れ替えて処理するか、のどちらかでしょうか? # ( 専門家のフォローを希望 ) Option Explicit Public Function GetDateDiffFormatString(ByVal dtmStart As Date, ByVal dtmEnd As Date) As String Dim strRet As String Dim intYear As Integer Dim intMonth As Integer Dim intDay As Integer intYear = DateDiff("yyyy", dtmStart, dtmEnd) intMonth = DateDiff("m", dtmStart, dtmEnd) If (Day(dtmStart) > Day(dtmEnd)) And (Not IsEndOfMonth(dtmEnd)) Then intMonth = intMonth - 1 End If If intMonth >= 12 Then intMonth = intMonth Mod 12 End If If DateSerial(Year(dtmEnd), Month(dtmStart), Day(dtmStart)) _ > DateSerial(Year(dtmEnd), Month(dtmEnd), Day(dtmEnd)) Then intYear = intYear - 1 End If If Day(dtmStart) <= Day(dtmEnd) Then intDay = Day(dtmEnd) - Day(dtmStart) Else If IsEndOfMonth(dtmEnd) Then intDay = DateDiff("d", dtmStart, GetEndOfMonth(dtmStart)) Else intDay = DateDiff("d", dtmStart, GetEndOfMonth(dtmStart)) _ + DateDiff("d", GetStartOfMonth(dtmEnd), dtmEnd) + 1 End If End If If intYear <> 0 Then strRet = CStr(intYear) & "年" End If If intMonth <> 0 Then strRet = strRet & CStr(intMonth) & "月" End If If intDay <> 0 Then strRet = strRet & CStr(intDay) & "日" End If GetDateDiffFormatString = strRet End Function Public Function IsEndOfMonth(ByVal dtmSource As Date) As Boolean '月末日であるかどうかを判定。 IsEndOfMonth = (dtmSource = GetEndOfMonth(dtmSource)) End Function Public Function GetEndOfMonth(ByVal dtmSource As Date) As Date '月末日を求める。 GetEndOfMonth = DateSerial(Year(dtmSource), Month(dtmSource) + 1, 0) End Function Public Function GetStartOfMonth(ByVal dtmSource As Date) As Date '月初を求める。 GetStartOfMonth = DateSerial(Year(dtmSource), Month(dtmSource), 1) End Function
お礼
こんなに早く、詳しい回答が頂けて嬉しいです。 詳しい回答本当にありがとうございます!! 早速試してみます。 助かりました。 初心者なもので何も分からず、本当に申し訳ありませんでした。
補足
何も分からず本当にすいません。 今フォームには[開始日][終了日][期間_年][期間_月]となっています。 終了日が更新された時にイベントを入れれば宜しいのでしょうか? 質問内容を詳しく記載せず、本当に申し訳ありませんでした。