- PR -

日付の計算について

投稿者投稿内容
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-08-15 20:55
まるくさん、ありがとうございました。
nn = DateAndTime.DateDiff ではコンパイルエラーが出ましたので、まるくさんは、
「これはVB6のコードなんでは」といわれましたが、私がACCESSでなれひたし
んだ nn = DateDiff("m", 着手日 ,伝票月日) + 1 を使いました。正常に動作して
います。

関数やモジュールを見つけるコツについては、Googleの「.NET」キーワード
検索ですか。私もこれからはこの検索を愛用します。どうもたいへんありがとう
ございました。

まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2007-08-16 13:06
引用:

「これはVB6のコードなんでは」といわれましたが、私がACCESSでなれひたし


オーバーロードされてたんですね。見落とし失礼しました。では。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-08-16 21:41
25行を短くしてみる。

 TimeSpan になると、日数しか出せない。これは、月や年は日数が固定していないから仕方がない。では、「月の日数は30日」と仮定すれば、30で割ることで近似的な月数が計算できる。
コード:
nn = (伝票日 - 着手日).Days / 30



 だんじりさんのコードを短くしてみる。
 よく見ると、AddMonths で加算する数と nn に設定する数が違うだけで、あとは同じである。次に、加算する数と nn に設定する数に何らかの関係がないか調べてみる。すると、「加算する数 == nn」という関係がある。では次に、加算する数の変化に、何らかの関係がないか調べてみる。すると、1ずつ増えていることがわかる。このことから、次のように組み立てることができる。
コード:
変数 n を、0 から 1 ずつ増加させる
    伝票日と着手日に n を加算した日を比較する
    もし、伝票日の方が小さいなら、nn に n を代入し、終わる
ループする


これを VB.NET のコードに変換すると、次の通り。
コード:
' 着手日が 1/10 で、伝票日が 2/15 だと、2ヶ月目となる
nn = 1
While (伝票日 < 着手日.AddMonths(nn))
    nn += 1
End While

だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-08-16 22:52
Jittaさん、いつもお世話になっています。
人間は、うまく動作すればそれが正しいと思いたくなるもので、ご指摘のとおり
近似値の30日で割り算していて、カレンダーを加味して2つの年月日の間隔を
計算していたのでわな以下というご指摘をいただきました。
早速、実証するために素人なりに単純な次のようなツーチーンを思索しました。

Dim ymd00, ymd1a, ymd1b, ymd2a, ymd2b, ymd3a, ymd3b, ymd4a, ymd4b As Date
ymd00 = CDate("2007 / 1 / 1")
ymd1a = CDate("2007 / 1 / 1")
ymd1b = CDate("2007 / 1 / 31")
ymd2a = CDate("2007 / 2 / 1")
ymd2b = CDate("2007 / 2 / 28")
ymd3a = CDate("2007 / 3 / 1")
ymd3b = CDate("2007 / 3 / 31")
ymd4a = CDate("2007 / 4 / 1")
ymd4b = CDate("2007 / 4 / 30")
MessageBox.Show("答えは1ヶ月目" & DateDiff("m", ymd00, ymd1a) + 1)
MessageBox.Show("答えは1ヶ月目" & DateDiff("m", ymd00, ymd1b) + 1)
MessageBox.Show("答えは2ヶ月目" & DateDiff("m", ymd00, ymd2a) + 1)
MessageBox.Show("答えは2ヶ月目" & DateDiff("m", ymd00, ymd2b) + 1)
MessageBox.Show("答えは3ヶ月目" & DateDiff("m", ymd00, ymd3a) + 1)
MessageBox.Show("答えは3ヶ月目" & DateDiff("m", ymd00, ymd3b) + 1)
MessageBox.Show("答えは4ヶ月目" & DateDiff("m", ymd00, ymd4a) + 1)
MessageBox.Show("答えは4ヶ月目" & DateDiff("m", ymd00, ymd4b) + 1)

実行した結果は、カレンダーを加味されてそれぞれの月数が正しく表示されていまし
た。よって日数の単純な割り算でわなく、実際のカレンダーを加味して計算され、
着手日からの月数を算出しているようです。Jittaさんのご指摘があるまで私も
単純に考えておりましたが、大変参考にさせていただきました。
今後ともよろしくお願いいたします。

よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-08-17 22:32
引用:

だんじりさんの書き込み (2007-08-16 22:52) より:
ツーチーンを思索しました。



ではないか?ルーチン?試作?

ごめん、どうでもいいことだけど、すっごく気になって…。
変換ミスなのかもしれませんが。

#自分も人のこと言えんけど書いたものは一度見直しましょう。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-09-02 22:36
よっし〜さん
ありがとうございます。私は昔から誤字脱字が多く、その上、書いた文章を
見直して間違いをチェックすることなく送信してしまいます。少し送信前に
みなおすことをするように注意します。よっし〜さん、ありがとうございま
した。

スキルアップ/キャリアアップ(JOB@IT)