経過月数を取得するには?


やまだ  2013-11-06 15:22:26  No: 45503  IP: [192.*.*.*]

こんにちは。

いつもお世話になっております。
開発環境は、win7(sp1)、delphiXE3enterprise(update適用なし)です。

データベースはSQLiteを使っています。

データをselectしてきて、経過月数を画面に表示したいと思っています。

SQLite側で経過月数を取得しようと思ったのですが、経過日数は取得出来たので31で割って画面に表示しようと思ったのですが、月に換算するのは抽出で複数月に跨る場合も想定されるので、31だったらあいまいになるかもと思っています。

そのため、maxを使って最新日を取得して、delphi側で経過月数を取得しようと考えました。

やりたいのは、最新日が取得できているので、now-最新日を月に換算したいというものです。

経過日数は引き算すればよいことは分かったのですが、経過月数はどうすれば良いのか分かりません。

よろしくお願いします。

編集 削除
DEKO  2013-11-06 15:45:21  No: 45504  IP: [192.*.*.*]

DateUtils.MonthsBetween() は 30.4375 で割って経過月数を求めていますね。
同じロジックだったら SQL でもできそうです。

[DateUtils.MonthsBetween (DocWiki)]
http://docwiki.embarcadero.com/Libraries/ja/System.DateUtils.MonthsBetween

編集 削除
tor  2013-11-18 20:46:56  No: 45505  IP: [192.*.*.*]



月当たりの日数というのは月ごとに異なるので、単純な引き算や割り算では一般に期待されるような「経過月数」にはならない気がします。

じゃあそもそも我々が期待する経過月数とはどういうものでしょうか。
まずそこの定義で合意がとれているか確認したいのですが、次のそれぞれについて期待する結果はいくつですか?(いずれも同じ年内の日付として)
ィアゥヲサウ月ウー日〜エ月ア日ヲサの経過月数
ィイゥヲサウ月ウー日〜エ月イケ日ヲサの経過月数
ィウゥヲサウ月ウー日〜エ月ウー日ヲサの経過月数
ィエゥヲサウ月ウー日〜キ月ウー日ヲサの経過月数
ィオゥヲサウ月ウー日〜キ月イケ日ヲサの経過月数
ィカゥヲサウ月ウー日〜キ月ウア日ヲサの経過月数
ィキゥヲサウ月ウー日〜ク月ア日ヲサの経過月数

ついでに、どういう考え方でその答えが出てきたかを辿ってみると自ずと計算方法が浮かんでくるかもしれません。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアウッアアッイイィ金ゥ アカコオクコエア  書込者ノト:ロ 」 ァ」ハノ

 ン

やまださんからの回答がありませんが、とりあえず期待値は次のようになると仮定します。
ィアゥヲサウ月ウー日〜エ月ア日ヲサの経過月数ヲサヲサスヲサー
ィイゥヲサウ月ウー日〜エ月イケ日ヲサの経過月数ヲサスヲサー
ィウゥヲサウ月ウー日〜エ月ウー日ヲサの経過月数ヲサスヲサア
ィエゥヲサウ月ウー日〜キ月ウー日ヲサの経過月数ヲサスヲサエ
ィオゥヲサウ月ウー日〜キ月イケ日ヲサの経過月数ヲサスヲサウ
ィカゥヲサウ月ウー日〜キ月ウア日ヲサの経過月数ヲサスヲサエ
ィキゥヲサウ月ウー日〜ク月ア日ヲサの経過月数ヲサヲサスヲサエ

これは次のようなロジックに基づいています。
アョヲサ月日からヶ月後の日付はヲサィォゥ月日ヲサである。
イョヲサィォゥ月日ヲサヲサスヲサ日付ヲサヲサヲサィォォアゥ月日ヲサなら、その日付の経過月数はヲサヲサである。

  例えばウッウーからアヶ月後、イヶ月後、ウヶ月後……の日付はそれぞれヲサエッウーャヲサオッウーャヲサカッウーャヲサョョョ
  エヶ月後の日付はキッウー。ィエゥィカゥィキゥはキッウー以降の日付なので、経過月数はエ
  ィオゥはキッウーより前の日付であり、まだエヶ月経っていないから経過月数はウ
  同様にして、エッウーのィウゥは経過月数ア、それより前の日付のィアゥィイゥは経過月数ー

(この論法だとエッウアといった存在しない日付が出てくる可能性もありますが、
その仮想上の日付より前か後かが判断できればいいので問題はありません)

私はこれが一般的な経過月数の考え方だと思うので、これに沿ってアルゴリズムを考えることにします。
違うよと思う方は適宜自分のロジックに合わせて修正してください。

日付アと日付イの間の経過月数を求めるアルゴリズム(ただしヲサ日付アヲサヲサスヲサ日付イヲサとする)コ
アョヲサ初期値ヲサヲサスヲサーヲサとする
イョヲサ「日付アのィォアゥヶ月後の日付」ヲサヲサヲサ日付イヲサが成り立っている間を増やし続ける

ヲサヲサメヲサコスヲサーサ
ヲサヲサヲサノヘィアャヲサメヲサォヲサアゥヲサヲサヲサイヲサヲサノィメゥサ

でもこれだと何だかかっこ悪いですね。アーーュアを計算するのにケケ回足し算をしているようなモヤモヤ感……
少し変形して、引き算一発でバシッと求まるようにしてみましょう。そのためには年の数字も考慮に入れる必要があります。
日付アと日付イの間の経過月数を求めるアルゴリズム(改)コ
アョヲサ日付イの「年・月」から日付アの「年・月」を引く
イョヲサもしヲサ日付イの「日」ヲサヲサヲサ日付アの「日」ヲサだったら、結果からさらにアを引く

ヲサヲサメヲサコスヲサルマィイゥヲサェヲサアイヲサォヲサヘマィイゥヲサュヲサルマィアゥヲサェヲサアイヲサュヲサヘマィアゥサ
ヲサヲサヲサトマィイゥヲサヲサヲサトマィアゥヲサヲサトィメゥサ
スススススススススススススススススススススススススススススススススススススススス
ニコ とのす
トコ イーアウッアアッイウィ土ゥ ーカコウウコイキ  書込者ノト:ロ 「。。 ン

おそらく消費税関連かとだと思いますがどう月割りにするかで変わってきます
水道検針関連の仕事をしていますが2ヶ月に一回の検針なので改定をはさんだ場合だと

ヲサウ月ウー日〜エ月ア日ヲサの経過月数ヲサヲサスヲサア
ヲサウ月ウー日〜エ月イケ日ヲサの経過月数ヲサスヲサア
ヲサウ月ウー日〜エ月ウー日ヲサの経過月数ヲサスヲサア

ヲサウ月ウー日〜オ月ウー日ヲサの経過月数ヲサスヲサイィ微妙ゥ
ヲサウ月ウー日〜オ月ウア日ヲサの経過月数ヲサスヲサイ

ヲサウ月ウー日〜カ月ウー日ヲサの経過月数ヲサスヲサイ
ヲサウ月ウー日〜カ月イケ日ヲサの経過月数ヲサスヲサイ
ヲサウ月ウー日〜キ月ウア日ヲサの経過月数ヲサスヲサウ
ヲサウ月ウー日〜ク月ア日ヲサの経過月数ヲサヲサスヲサエ

日割りでなければこんな感じになります。
月だけでみればモムフでも書けると思うのですが仕様がわからないのでこんなところで
スススススススススススススススススススススススススススススススススススススススス
ニコ とのすヲサ
トコ イーアウッアアッイウィ土ゥ ーカコエイコエア  書込者ノト:ロ 「。。 ン

ヲサヲサウ月ウー日〜カ月ウー日ヲサの経過月数ヲサスヲサイ
ヲサヲサウ月ウー日〜カ月イケ日ヲサの経過月数ヲサスヲサイ
ヲサウ月ウー日〜キ月ウア日ヲサの経過月数ヲサスヲサウ
ヲサヲサウ月ウー日〜ク月ア日ヲサの経過月数ヲサヲサスヲサエ
間違えました。ォアしてください

編集 削除