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

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

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

You are not logged in.

Announcement

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


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

junkichi
Guest

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

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

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

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

kaze3
Guest

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

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

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

Shin
Member

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 & "日"
	)
) 

Last edited by Shin (2020-09-17 18:15:35)

Offline

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

Hiro
Member

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

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

Offline

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

チポ
Member

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

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

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

Offline

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

qb_dp
Member

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
)

Offline

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

qb_dp
Member

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

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

Offline

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

Shin
Member

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
	)
)

Last edited by Shin (2020-09-19 10:24:20)

Offline

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

qb_dp
Member

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
)

Offline

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

qb_dp
Member

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
)

Offline

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

qb_dp
Member

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

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

Offline

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

Shin
Member

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

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

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.007 seconds, 10 queries executed - Memory usage: 529.5 KiB (Peak: 550.04 KiB) ]