初心者のFileMaker pro Q&A

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

1.ファイルメーカーで解らない事があればここで質問して下さい。

何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

ログインしていません。

アナウンス


#1 2020-09-15 11:34:34

junkichi
ゲストユーザー

現在の日付から登録されている日付まで残りの年月日数を計算したいです。

契約終了日という日付フィールドがあり、
現在の日付から契約終了日までの残り年月日数をカウントダウンする計算フィールドを作成したいです。
(フィールド名を「残り」とします)

エクセルでいうDATEDIF関数のような処理をしたいです。

#2 2020-09-15 16:27:09

kaze3
ゲストユーザー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

「残り」を計算フィールドで作成し、内容を「契約終了日 - Get(日付)」、計算結果を「日付」で返すように設定します。
「残り」フィールドを配置して、インスペクタのデータ書式設定を日付タブ、書式はその他、に設定します。
この段階で年月日と表示されるので、お好みにあわせて月をヶ月に変更したりして利用されてはいかがでしょうか。

#3 2020-09-15 21:29:13

Shin
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

日数を年月日に変換して表示させると、開始日を考えて、非常に不自然ですよ。例えば、3ヶ月1日の翌日には、2ヶ月28日とか29日になります。

どのように表示させるかの規則をつくらないといけないでしょうね。例えば、1月30日から3月30日までは、1ヶ月後の2月30日が存在しないので、1ヶ月30日とするか1ヶ月29日とするか2ヶ月0日とするか、それとも別の結果にするかとか。

年月日をそれぞれ比較し、1年越えでしたら年月日単位、1ヶ月越えでしたら月日単位、それ以下は日単位、とするサンプル式です。

Let (
[
	YM = Int ( Year ( 日付 ) * 12 + Month ( 日付 ) + Day ( 日付 ) / 100 - Year ( 日付0 ) * 12 - Month ( 日付0 ) - Day ( 日付0 ) / 100 ) ;
	Y = Div ( YM ; 12 ) ;
	M = Mod ( YM ; 12 ) ;
	D = Min ( 
		Date ( Month ( 日付 ) - YM ; Day ( 日付 ) ; Year ( 日付 ) ) ; 
		Date ( Month ( 日付 ) - YM + 1 ; 0 ; Year ( 日付 ) ) 
	      ) - 日付0 
] ;
	Case (
		Y ; Y & "年" & M & "月" & D & "日" ;
		M ; M & "月" & D & "日" ;
		D & "日"
	)
) 

編集者 Shin (2020-09-17 18:15:35)

オフライン

#4 2020-09-15 21:46:41

Hiro
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

>#1『カウントダウンする計算フィールド』
「カウントダウン」→「日替わり自動更新」するなら、
計算フィールドの索引設定で「計算結果:非保存(必要な時に再計算する)」に設定変更します。

オフライン

#5 2020-09-16 10:23:53

チポ
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

FMの日付は
数値1を0001/01/01として
1日ごとのシリアル値になっています。

ですから、例えば、
  今日 - 昨日
を日付とすると
  0001/01/01
となってしまいますよ。

オフライン

#6 2020-09-18 17:53:38

qb_dp
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

以下で Excel の DateDif関数と 同様の値を取得できます。(たぶん...)

While (
    [
S=GetAsDate ( "2020/2/1" );
E=GetAsDate ( "2021/3/31" );
D=s;
        countY = -1 ;
        countM = -1 ;
        countD = 0
    ] ;
    D ≤ E ;
    [
dD = Day ( D );
mD = Month ( D );
dS = Day ( s );
countY = If(mD & "_" & dD = Month ( S ) & "_" & ds;countY+1;countY);
Bool = If(dD=dS ;1; 0) ;
countM = If(Bool ; countM + 1 ; countM) ;
countD = If(Bool ; 0 ; countD + 1) ;
D=Date ( mD ; dD+1 ; Year ( D ) )

    ] ;
    countY & "/" & countM-(countY*12) & "/" & countD
)

オフライン

#7 2020-09-18 18:11:29

qb_dp
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

あ~...
基準日が29日以降だと、ダメでした...。

オフライン

#8 2020-09-18 18:33:26

Shin
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

こんなカスタム関数がいいのかも。

//DATEDIF ( startDate ; endDate ; unit )
//
//指定された期間を計算
//
//unit
//	"Y"	期間の年数です。
//	"M"	期間の月数です。
//	"D"	期間の日数です。
//	"MD"	開始日から終了日までの日数です。 日付の月数および年数は無視されます。(誤差を含みます)
//	"YM"	開始日から終了日までの月数です。 日付の日数および年数は無視されます。
//	"YD"	開始日から終了日までの日数です。 日付の年数は無視されます。(誤差を含みます)
//

Let (
[
	YM = Int ( Year ( endDate ) * 12 + Month ( endDate ) + Day ( endDate ) / 100 - Year ( startDate ) * 12 - Month ( startDate ) - Day ( startDate ) / 100 ) ;
	Y =  Div ( YM ; 12 ) ;
	M =  Mod ( YM ; 12 ) ;
	D =  Min ( Date ( Month ( endDate ) - YM ; Day ( endDate ) ; Year ( endDate ) ) ; Date ( Month ( endDate ) - YM + 1 ; 0 ; Year ( endDate ) ) ) - startDate ;
	Dy = Min ( Date ( Month ( endDate ) ; Day ( endDate ) ; Year ( endDate ) - Y ) ; Date ( Month ( endDate ) + 1 ; 0 ; Year ( endDate ) - Y ) ) - startDate 
] ;
	Case (
		unit = "Y" ;  Y ;
		unit = "M" ;  YM ;
		unit = "D" ;  endDate - startDate ;
		unit = "MD" ; D ;
		unit = "YM" ; M ;
		unit = "YD" ; Dy
	)
)

編集者 Shin (2020-09-19 10:24:20)

オフライン

#9 2020-09-18 23:37:29

qb_dp
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

ん~、こうかなぁ...面倒...。

While (
    [
S=GetAsDate ( "2020/1/31" );
E=GetAsDate ( "2021/1/29" );
EMS=Date ( Month ( S )+1 ; 0 ; Year ( S ) );
dS = Day ( S );
D=S;
        countY = -1 ;
        countM = -1 ;
        countD = 0
    ] ;
    D ≤ E ;
    [
dD = Day ( D );
mD = Month ( D );
EM=Date ( Month ( D )+1 ; 0 ; Year ( D ) );

countY = If(mD & "_" & dD = Month ( S ) & "_" & ds;countY+1;countY);
Bool = If(S=EMS; If(dD=Day(EM) ;1; 0) ; If(dD=dS ;1; 0));
countM = If(Bool ; countM + 1 ; countM) ;
countD = If(Bool ; 0 ; countD + 1) ;
D=Date ( mD ; dD+1 ; Year ( D ) )
    ] ;
    countY & "/" & countM-(countY*12) & "/" & countD
)

オフライン

#10 2020-09-19 13:52:46

qb_dp
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

ダメだったので修正。

While (
    [
S=GetAsDate ( "2020/2/29" );
E=GetAsDate ( "2021/3/1" );
EMS=Date ( Month ( S )+1 ; 0 ; Year ( S ) );
dS = Day ( S );
D=S;
        countY = -1 ;
        countM = -1 ;
        countD = 0
    ] ;
    D ≤ E ;
    [
dD = Day ( D );
mD = Month ( D );
EM=Date ( Month ( D )+1 ; 0 ; Year ( D ) );

CheckDate=If(S=EMS; EM;D);

countY = If(mD & "_" & dD = Month ( S ) & "_" & Day(CheckDate);countY+1;countY);

Bool = If(dD=Day(CheckDate) ;1; 0) ;
countM = If(Bool ; countM + 1 ; countM) ;
countD = If(Bool ; 0 ; countD + 1) ;
D=Date ( mD ; dD+1 ; Year ( D ) )
    ] ;
    countY & "/" & countM-(countY*12) & "/" & countD
)

オフライン

#11 2020-09-20 00:52:50

qb_dp
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

ダメダメだったので忘れてください。

オフライン

#12 2020-09-21 10:46:41

Shin
メンバー

Re: 現在の日付から登録されている日付まで残りの年月日数を計算したいです。

月末の処理は、規則がないので、絶対正しい処理は無いですよ。
例えば1月25日から3月10日までは、1ヶ月16日でも1ヶ月13日でも、1ヶ月14日でも正解ですよ。
それぞれ、1月25日から2月10日の16日と1ヶ月と考えてもいいでしょうし(これが私の計算)、1ヶ月と2月25日から3月10日の13日か14日とも考えられます。どちらも間違いではないでしょうね。

オフライン

クィック投稿

メッセージを書いて送信してください。
登録の確認

実在の人物による登録であることを確認します。

Board footer