みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
契約終了日という日付フィールドがあり、
現在の日付から契約終了日までの残り年月日数をカウントダウンする計算フィールドを作成したいです。
(フィールド名を「残り」とします)
エクセルでいうDATEDIF関数のような処理をしたいです。
「残り」を計算フィールドで作成し、内容を「契約終了日 - Get(日付)」、計算結果を「日付」で返すように設定します。
「残り」フィールドを配置して、インスペクタのデータ書式設定を日付タブ、書式はその他、に設定します。
この段階で年月日と表示されるので、お好みにあわせて月をヶ月に変更したりして利用されてはいかがでしょうか。
日数を年月日に変換して表示させると、開始日を考えて、非常に不自然ですよ。例えば、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
>#1『カウントダウンする計算フィールド』
「カウントダウン」→「日替わり自動更新」するなら、
計算フィールドの索引設定で「計算結果:非保存(必要な時に再計算する)」に設定変更します。
Offline
FMの日付は
数値1を0001/01/01として
1日ごとのシリアル値になっています。
ですから、例えば、
今日 - 昨日
を日付とすると
0001/01/01
となってしまいますよ。
Offline
以下で 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
あ~...
基準日が29日以降だと、ダメでした...。
Offline
こんなカスタム関数がいいのかも。
//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
ん~、こうかなぁ...面倒...。
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
ダメだったので修正。
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
ダメダメだったので忘れてください。
Offline
月末の処理は、規則がないので、絶対正しい処理は無いですよ。
例えば1月25日から3月10日までは、1ヶ月16日でも1ヶ月13日でも、1ヶ月14日でも正解ですよ。
それぞれ、1月25日から2月10日の16日と1ヶ月と考えてもいいでしょうし(これが私の計算)、1ヶ月と2月25日から3月10日の13日か14日とも考えられます。どちらも間違いではないでしょうね。
Offline
Pages: 1
[ Generated in 0.014 seconds, 9 queries executed - Memory usage: 531.95 KiB (Peak: 552.49 KiB) ]