• ベストアンサー

ACCESSで年数と日付の間隔の算出

はじめて質問します。 ACCESS2000を使用しています。 DataDiffを使用して[終了年月日]から[開始年月日]の間の、 年数と月数を求めたいのですが。(3年4ヶ月などというように) 1月31日から2月1日とした時に1月とされてしまう点や、負の数が返されてしまう点を改善したいのですが。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#5584
noname#5584
回答No.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

take2003
質問者

お礼

こんなに早く、詳しい回答が頂けて嬉しいです。 詳しい回答本当にありがとうございます!! 早速試してみます。 助かりました。 初心者なもので何も分からず、本当に申し訳ありませんでした。

take2003
質問者

補足

何も分からず本当にすいません。 今フォームには[開始日][終了日][期間_年][期間_月]となっています。 終了日が更新された時にイベントを入れれば宜しいのでしょうか? 質問内容を詳しく記載せず、本当に申し訳ありませんでした。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>年数と月数を求めたいのですが。(3年4ヶ月などというように) これについては単純に月でDateDiffを呼んで、12で割って商と余りを求めれば1発でしょう。 >> 1月31日から2月1日とした時に1月とされてしまう点や、 >負の数が返されてしまう点を改善したい 1ヶ月と数えられるのは仕様なんですけどねぇ。 2-1なんですから。 それに文句をつけちゃなんにもできませんよ。 対応するにゃ終了日に1日足せばいいじゃないですか。 負の数だって、数学的に考えて絶対値を取れば何にも問題ないんじゃないですか? Abs()でできますよね。

take2003
質問者

お礼

すいませんでした。 初心者なもので考えが浮かばず・・・ 参考になりました! 本当にありがとうございました。

noname#5584
noname#5584
回答No.1

> 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

関連するQ&A

  • 指定日付期間の算出の方法

    2000年11月1日から2002年3月31日までの 勤務年数と月数を、エクセル2000で計算しようとしています。 DATEDIFを使って、計算をしてみたのですが 1年未満の月数が「4ヶ月」と計算結果がでてしまいます。 これを「5ヶ月」と表示されるように計算式を作りたいのです。 単純に、終了期間を2002年4月1日にしたり、+1と入力すれば 欲しい計算結果を得られるのですが、このほかの方法がないか知りたいのです。 どなたかいい計算式を教えていただけないでしょうか?

  • アクセスで「本日日付」と「入社日付」から勤続年数をだせるようにしたいのです。。

    すみません。アクセスはじめて約2週間の初心者です。アクセスで「本日日付」と「入社日付」から勤続年数をだせるようにしたり、「本日日付」と「生年月日」から、満年齢(できれば、○才○か月などのように)を表示させるようにしたいのですが、まず「本日日付」というのが表示できません。。(涙)。。「today()」というのをどこかにいれればできるのかなとおもっていろいろ試したのですが何か簡単な方法はあるでしょうか?

  • 勤続年数の求め方

    Access2003+SQLServer2005を使っています。 Accessのクエリでは勤続年数(2007年3月20日現在の勤続年数)を求めるのに以下を使っていました。 勤続年数: DateDiff("m",[入社年月日],#2007/03/20#)\12 & "年" & DateDiff("m",[入社年月日],#2007/03/20#) Mod 12 & "ヶ月" これを、ストアドプロシージャで行うにはどのように記述すればよいでしょうか? よろしくお願いします。

  • 在籍年数の計算について

    EXCELで社員の在籍年月数を計算式で出したいのですが、 A列に入社年月日(例:H11.1.1) B列に退社年月日(例:H12.12.31) C列に在籍年数を=YEAR(B)-YEAR(A) D列に余りの月数を=MONTH(B)-MONTH(A) とした場合、 正しくは1年0ヶ月となるはずが、 なぜか「0年11ヶ月」となってしまいます。 正しく表示されるにはどうしたらいいのでしょうか? よろしくお願いいたします。

  • ACCESS97で現在の日付から勤続年月数を算出する関数

    ACCESS97で社員名簿を作っています。 現在の日付から年齢を算出する関数は調べたところ次のようにすればよいとわかりました。 IIf(Right(Format([生年月日],"yyyy/mm/dd"),5)>Right(Format(Now(),"yyyy/mm/dd"),5),DateDiff("yyyy",[生年月日],Now())-1,DateDiff("yyyy",[生年月日],Now())) 次は現在日から入社年月日フィールドにあるデータを使い、勤続年数○年○ヶ月というクエリーを作りたいのですが、○ヶ月を算出する応用がわからずに困っております。 どうかよろしくお願いします。

  • Accessの日付計算に関して

    下記のような計算をAccess上で実現したいと考えております。 店舗の事業年度期首もしくは開店日から現在までの月数を計算する方法 一月未満の月がある場合分かるように小数点か何かで分かるようする。 最終的には都道府県ごとに集計する。 ※ 可能であれば一ヶ月未満の集計ができるようにしたい。 同じ都道府県内に1ヶ月未満店舗が複数店舗あったとして 複数店舗合わして1ヶ月以上営業していたのかどうか。 アドバイスお願いします。

  • アクセスで

    アクセスでフォームが5つあるとします。(フォーム名は、1,2,3,4,5とします。)フォームにはすべて"開始年月日"と"終了年月日"の項目があり、5つのクエリの検索をそれぞれ入力する様になっています。 又、テーブル1があり、このテーブルは毎日データが追加されていきますが(1日50ほど)、追加されたデータは、その日のデータでは無く、2日前の物の場合もあれば、休みを挟んだりすると5日前の物の場合もあります。そのデータ自体の"年月日"フィールドがあります。 まず全てのフォームの"終了年月日"の項目の既定値をテーブル1の"年月日にする事"はできますか? そしてフォーム1で"開始年月日"と"終了年月日"を入力し確定した時に、その他のフォームを開くとフォーム1で入力した"開始年月日"と"終了年月日"が入力された状態にしたいのです。これは、フォーム1で"開始、終了年月日"を入力した場合だけでなく、どのフォームで"開始、終了年月日"を入力した場合でも、その他のフォームを開くと同じ"開始、終了年月日"がまず入力された状態になっていて変更し確定した場合は、他のフォームの"開始、終了年月日"も変更されているという様にしたいのです。 説明がうまくできなくてすいませんが、誰か教えて頂けないでしょうか?よろしくお願いします。

  • アクセス2007で

    アクセス2007で、クエリで検索条件を"~年~月~日から~年~月~日"までとし、それぞれ開始月、終了月を入力するとその間のデータが表示される様にしたのですが、この年月日を入力する際に、フォームに日付を入力する時の様にカレンダーが表示され、カレンダーの日を選択すれば入力できる様にできませんか? 誰か教えて下さい。よろしくお願いします。

  • DATEDIF関数で期間月数を算出

    過去ログを見て悪戦苦闘しているのですが・・・ 開始日から終了日までの月数を算出したいんです。 A1:1999/8/25(開始日) B1:2004/3/31(終了日) C1:56 C1を求める数式です。 開始日の月も、終了日の月も反映させます。 宜しくお願いします。

  • Excelで入社・退社年月日を入力して、勤続年数表示したい

    Excelで入社年月日と退社年月日を入力すると、 勤続年数が表示できるようにしたいのですが、 方法が分かりません。 DateDifという関数があると過去の質問を検索してみたらでてきましたが、どのように使ったらよいのかが分かりません。 入社年月日⇒14年4月1日 退社年月日⇒16年4月20日 勤続年数⇒2年1ヶ月 という具合に、一ヶ月未満の日数がある場合は1ヶ月に繰上げて表示したいです。 そして、休業期間がある場合は同様に休業期間を表示して、勤続年数からマイナスして結果的に 勤続年数-休業期間=在職期間 と表示できるようにしたいです。 ご存知のかた教えてください!よろしくお願いいたします。

専門家に質問してみよう