初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2018-03-03 10:37:41

Haru
Member

日付の差分について

お世話になっております。
環境はWin10FM16になります

登録日
満了日
のフィールドがあり
残り月日 〇ヶ月〇日と表示できるよう計算式を探して
Let (
[

data = 満了日 ;
  d1 = Max ( data ; 登録日 ) ;
  d0 = Min ( data ; 登録日 ) ;
  YM1 = Year ( d1 ) * 12 + Month ( d1 ) + Day ( d1 ) / 100 ;
  YM0 = Year ( d0 ) * 12 + Month ( d0 ) + Day ( d0 ) / 100 ;
  m = Int ( YM1 - YM0 ) ;
  d = Case ( Day ( d1 ) = Day ( d0 ) ; 0 ; Day ( d1 - Day ( d0 ) ) )
] ;
  Case (
   m = 0 ; d & "日" ;
   m < 12 ; Mod ( m ; 12 ) & "ヶ月" & d & "日" ;
   Div ( m ; 12 )  & "年" & Mod ( m ; 12 ) & "ヶ月" & d & "日"
  )  )

と組んでみましたがどうも思ったようにならず困っています
残り1ヶ月の仕様としては
満了日:2018/3/28 の場合、

2018/1/28 では2ヶ月

2018/1/29 では1ヶ月30日

2018/2/28 では1ヶ月
となればいいなと思っております
ご教授お願い致します。

Offline

#2 2018-03-03 18:46:21

Shin
Member

Re: 日付の差分について

年、月と日は0で無ければ表示、ということですか。
Let (
[
  D0 = Min ( 満了日 ; 登録日 ) ;
  D1 = Max ( 満了日 ; 登録日 ) - Day ( D0 ) ;
  D0 = D0 - Day ( D0 ) ;
  YM1 = Year ( D1 ) * 12 + Month ( D1 ) ;
  YM0 = Year ( D0 ) * 12 + Month ( D0 ) ;
  ym = Int ( YM1 - YM0 ) ;
  y = Div ( ym ; 12 ) ;
  m = Mod ( ym ; 12 ) ;
  d = Day ( D1 + 1 ) - 1
] ;
  Case ( y ; y & "年" ) & Case ( m ; m & "ヶ月" ) & Case ( d ; d & "年" )
)
にすればいかがでしょう。

Last edited by Shin (2018-03-04 14:27:54)

Offline

#3 2018-03-05 09:16:37

Haru
Member

Re: 日付の差分について

Shin様
ご返信ありがとうございます。
結果のほうがテキスト・数字・日付など全てにおいて?年?月?日や?と表示されてしまいます
原因が自分では判明できず、何かしら基本的な事がぬけていますでしょうか?

Offline

#4 2018-03-05 09:24:31

チポ
Member

Re: 日付の差分について

Haruさんの式で
> m = Int ( YM1 - YM0 )
これは、さらに
  d0の日がd1の日より大きければ 1 を引く
を加えないとダメでしょう。


さらに、dは
d0の日がd1の日以下ならその差をとり、
より大きければ
  d0の日からその月の月末までの日数をd1の日に加える

と考えればいいのでは。

Offline

#5 2018-03-05 10:11:40

Haru
Member

Re: 日付の差分について

チポ様ご返信ありがとうございます。
ご指摘をもとにやってみました
Let (
[

data = 満了日 ;
  d1 = Max ( data ; 登録日 ) ;
  d0 = Min ( data ; 登録日 ) ;
  YM1 = Year ( d1 ) * 12 + Month ( d1 ) + Day ( d1 ) / 100 ;
  YM0 = Year ( d0 ) * 12 + Month ( d0 ) + Day ( d0 ) / 100 ;
  m = If ( Day ( d0 ) > Day ( d1 ) ;Int ( YM1 - YM0 ) - 1 )
  d = Case ( Day ( d1 ) = Day ( d0 ) ; 0 ; Day ( d0 ) <  Day ( d1 ) ; Day ( d1 )- Day ( d0 ) ;  Day ( d0 ) >   Day ( d1 ) ; Day ( d1 )- Day ( d0 ))
] ;
  Case (
   m = 0 ; d & "日" ;
   m < 12 ; Mod ( m ; 12 ) & "ヶ月" & d & "日" ;
   Div ( m ; 12 )  & "年" & Mod ( m ; 12 ) & "ヶ月" & d & "日"
  )  )
結果ですが
> d = Case ( Day ( d1 ) = Day ( d0 ) ; 0 ; Day ( d0 ) <  Day ( d1 ) ; Day ( d1 )- Day ( d0 ) ;  Day ( d0 ) >   Day ( d1 ) ; Day ( d1 )- Day ( d0 ))
の部分のdが指定されたフィールドが見つかりませんとなり、?が頭に飛んでおります
ご指摘よろしくお願いいたします。

Offline

#6 2018-03-05 11:11:29

Shin
Member

Re: 日付の差分について

2018/1/29 では1ヶ月30日
の30日は、どこを基準にした30日ですか。2ヶ月未満なので、1ヶ月後の日付から数えると思いますが、さらに2月29日が無いので、3月1日基準で考えると、1ヶ月28日、月末という考え方で2月28日基準にすると1ヶ月29日になります。
それとも同月の同日(3月29日)が基準ですか。

Last edited by Shin (2018-03-05 11:14:57)

Offline

#7 2018-03-05 11:51:03

チポ
Member

Re: 日付の差分について

>   YM1 = Year ( d1 ) * 12 + Month ( d1 ) + Day ( d1 ) / 100 ;
>   YM0 = Year ( d0 ) * 12 + Month ( d0 ) + Day ( d0 ) / 100 ;

これは、「日」を使いませんから
  YM1 = Year ( d1 ) * 12 + Month ( d1 ) ;
  YM0 = Year ( d0 ) * 12 + Month ( d0 ) ;
でいいでしょう


>   m = If ( Day ( d0 ) > Day ( d1 ) ;Int ( YM1 - YM0 ) - 1 )
条件が偽の場合、値を返していませんよ

  m = YM1 - YM0 - ( Day ( d0 ) > Day ( d1 ) )
でいいですね。


d0の月末は
  Date ( Month ( d0 ) + 1 ; 0 ; Year ( d0 ) )
で求められます。

  d = Case ( Day ( d0 ) <= Day ( d1 ) ; Day ( d1 ) - Day ( d0 ) ; ( Date ( Month ( d0 ) + 1 ; 0 ; Year ( d0 ) ) - d0 ) + Day ( d1 ) )
でいいでしょう。

Offline

#8 2018-03-05 12:03:33

Haru
Member

Re: 日付の差分について

Shin様
ご返信ありがとうございます。
1ヶ月は何日で判断するのかということですよね
私の設定が甘かったようで大変失礼致しました。
どのように設定するのが適切なのか判断しかねるところですが、満了日が3月28日の場合で本日の日付が1月29日の場合だと、1月は残り2日で、2月と3月はそれぞれ1ヶ月とした考え方もできますか?

ちなみにですが、1ヶ月の扱いが不明瞭な場合残り〇日のみで表示した方が簡単になりますでしょうか?
1ヶ月の扱いが人によって違うとなると、運用するときに不便になりそうな気がしてきまして

Offline

#9 2018-03-05 12:08:25

Haru
Member

Re: 日付の差分について

チポ様
ご返信ありがとうございます。
上記内容にありますようにShin様のご指摘で1ヶ月の扱いに関してなかなか一般的なものがなさそうと気づき、苦慮している次第であります
なので〇ヶ月の表示をやめて〇日のみのものも検討していこうと思っております。
私の方でも計算式の見直しを検討していく所存ではありますが、何かアドバイス等ございましたら、ご教授お願い致します。

Offline

#10 2018-03-05 13:15:20

Shin
Member

Re: 日付の差分について

どのように設定するのが適切なのかは、運用者が決めればいい事です。それを、運用の中と契約の中に組み込みます。その意味で、
> 満了日が3月28日の場合で本日の日付が1月29日の場合だと、1月は残り2日で、2月と3月はそれぞれ1ヶ月とした考え方もできますか?
でもいいと思いますが、3月は28日ですので、足して1ヶ月30日になるのでしょね。

Let (
[
  D0 = Min ( 満了日 ; 登録日 ) ;
  D1 = Max ( 満了日 ; 登録日 ) ;
  YM0 = Year ( D0 ) * 12 + Month ( D0 ) ;
  YM1 = Year ( D1 ) * 12 + Month ( D1 ) ;
  d00 = Day ( Date ( Month ( D0 ) + 1 ; 0 ; Year ( D0 ) ) ) ;
  d = Mod ( d00 - Day ( D0 ) + Day ( D1 ) ; d00 ) ;
  ym = YM1 - YM0 - 1 + Div ( d00 - Day ( D0 ) + Day ( D1 ) ; d00 ) ;
  y = Div ( ym ; 12 ) ;
  m = Mod ( ym ; 12 )
] ;
Case ( y ; y & "年" ) & Case ( m ; m & "ヶ月" ) & Case ( d ; d & "日" )
)

Last edited by Shin (2018-03-05 15:37:42)

Offline

#11 2018-03-05 15:49:52

Haru
Member

Re: 日付の差分について

Shin様、チポ様
お二方の回答をよく読んで再度勉強させていただきます。
動作の方は問題ありませんでした。
この度はありがとうございました。

Offline

#12 2018-03-05 16:18:59

Shin
Member

Re: 日付の差分について

チポさん
> YM1 = Year ( d1 ) * 12 + Month ( d1 ) + Day ( d1 ) / 100 ;
> YM0 = Year ( d0 ) * 12 + Month ( d0 ) + Day ( d0 ) / 100
> m = Int ( YM1 - YM0 ) ;
と、
> YM1 = Year ( d1 ) * 12 + Month ( d1 ) ;
> YM0 = Year ( d0 ) * 12 + Month ( d0 ) ;
> m = YM1 - YM0 - ( Day ( d0 ) > Day ( d1 ) )
は、同じ値を換えしますよ。好き好きですが、私は前者が好み。

Offline

#13 2018-03-05 16:52:54

チポ
Member

Re: 日付の差分について

また突っ込まれてしまった ^^;;

最後の投稿後気がついたんですが、、
最初に「なんじゃ?」と思ってそのままきてしまいました。

わざわざ式を訂正する必要はなかったですね -_-


Haruさんも言われてますが、
期間に「ヶ月」を入れようとするとその決め方にいろいろでてきますよね。

正確には、「日」として、
ヵ月○日が分かりやすい、と言うなら
およそ程度に考えた方がいいでしょうかね。

Offline

#14 2018-03-07 08:59:25

Shin
Member

Re: 日付の差分について

一番シビアに見ているのが小児科の先生かもしれませんね。
聞いた話では、だいたいですが、2ヶ月未満では日齢何日、それを過ぎると2歳くらいまでは年月齢で何歳何月、それ以降は年齢になるそうです。
銀行は、日割りで計算するので、締め日はありますが、月数は関係ない様です。

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 592.48 KiB (Peak: 609.02 KiB) ]