• ベストアンサー

アクセスで、期間を求めたい。

アクセス2000を使っています、同一テーブル内、フィールド別々に入社日と退社日があり入社日には2003/4/1と入力されて居り、退社日には2005/9/30と入っています、退社日までの勤務日数を、何年何ヶ月何日で求めたいです、退社未記入の場合は、今日現在までの勤務日数を、何年何ヶ月何日で求めたいです、

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

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

>退社日までの勤務日数を、何年何ヶ月何日で求めたいです クエリやフォーム上等で求めるには2通りのやり方があります。 全て求める記述をするか標準モジュールに関数を作って求めるかです。 下記の記述をコピーする。(フィールド名が入社日・退社日ならそのままコピーでOKです。) =Int((IIf(DatePart("d",[入社日])>DatePart("d",[退社日]),DateDiff("m",[入社日],[退社日])-1,DateDiff("m",[入社日],[退社日]))/12)) & "年" & IIf(DatePart("d",[入社日])>=DatePart("d",[退社日]),DateDiff("m",[入社日],[退社日])-1,DateDiff("m",[入社日],[退社日])) Mod 12 & "ヶ月" & IIf(DatePart("d",[入社日])>DatePart("d",[退社日]),DateDiff("d",[入社日],DateSerial(DatePart("yyyy",[入社日]),DatePart("m",[入社日])+1,0))+DatePart("d",[退社日]),DatePart("d",[退社日]-DatePart("d",[入社日]))) & "日" または標準モジュールに関数を作りその関数を使う。 標準モジュールに下記をコピーします。 Public Function GetYMD(SDate, EDate) As String If IsNull(SDate) Or IsNull(EDate) Then Exit Function Dim M As Long Dim D As Long Dim D1 As Long Dim D2 As Long D1 = DatePart("d", SDate) D2 = DatePart("d", EDate) If D1 > D2 Then M = DateDiff("m", SDate, EDate) - 1 D = DateDiff("d", SDate, DateSerial(DatePart("yyyy", SDate), DatePart("m", SDate) + 1, 0)) + D2 Else M = DateDiff("m", SDate, EDate) D = D2 - D1 End If GetYMD = (M \ 12) & "年" & (M Mod 12) & "ヶ月" & D & "日" End Function デバックしてエラーにならなければクエリやフォームのコントロールに =GetYMD([入社日],[退社日]) とすれば同様に求められます。

noname#68618
質問者

お礼

大変遅くなりました、思い通りの物が出来ました有難う御座いました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#182251
noname#182251
回答No.1

下記のようなSQL文で日数は出ます SELECT IIf(IsNull([Date]),Now(),[Date]) AS a, [a]-[BDate] AS b FROM goo; しかし何年何ヶ月何日と云うことだと、閏年などはどのように考えるのでしょうか? フォーマットを yy/mm/dd などにすれば、取り敢えず年月日では出ますけど

noname#68618
質問者

補足

大変遅くなり申し訳ありません、閏年も計算に入れる必要があります、上記の記事で式を入れると、構文エラーがでますが再度教えて下さい。

すると、全ての回答が全文表示されます。

関連するQ&A