注:下記で紹介する方法は自己流で設定したものなので、もっと簡潔にできる数式があるかも知れません。
用途
考えられる用途を挙げてみます。
- 行動を作成するアクションに日付項目を使いたい
- うるう年を考慮した年数追加を行いたい
多いのは①のケースかと思います。フロー・プロセス等で行動を作成する際のデータ型は
日付項目ではなく日付/時間項目です。
つまり、日付項目を元に行動を作成し、カレンダーに予定を追加したい場合に便利です。
数式紹介
早速ですが数式を紹介していきましょう。
DATETIMEVALUE(
TEXT(
IF(
OR(
MOD( YEAR( 日付項目 ), 400 ) = 0,
AND(
MOD( YEAR( 日付項目 ), 4 ) = 0,
MOD( YEAR( 日付項目 ), 100 ) != 0
)
),
IF (
MONTH( 日付項目 ) = 2 && DAY( 日付項目 ) = 29,
DATE( YEAR( 日付項目 ) + 『年数』 , MONTH( 日付項目 ) , DAY( 日付項目 ) -1 ) ,
DATE( YEAR( 日付項目 ) + 『年数』 , MONTH( 日付項目 ) , DAY( 日付項目 ) )
) ,
DATE( YEAR( 日付項目 ) + 『年数』 , MONTH( 日付項目 ) , DAY( 日付項目 ) )
)
)
& ” ” & TEXT( 時間項目 ) )
各行で何を行なっているのかも簡単に書いておきます。
1・2・19(最後)行目
DATETIMEVALUE( TEXT(
) & ” ” &『時間項目』)
DATETIMEVALUE( )
この部分では日付/数式項目への変換を行なっています。
https://help.salesforce.com/articleView?id=sf.customize_functions_a_h.htm&type=5
上記ヘルプにもありますがDATETIMEVALUE関数は
DATETIMEVALUE("2005-11-15 17:00:00")
は、日時値として November 15, 2005 5:00 PM GMT を表示します。
というようにテキストで入力した値を日付/時間項目で返すという働きがあります。これを利用します。
TEXT( )
次のTEXT関数は日付項目や時間項目をテキスト化するためのものです。()がややこしいのは年数追加の演算の影響です。
ですのでDATETIMEVALUE関数の()内は
TEXT(日付項目) & ” ” & TEXT(時間項目)
時間項目がない場合は
TEXT(日付項目) & ” ” & “任意の時間(時:分:秒)”
というような形式になります。
3~10行目(最初のIF関数)
このIF関数はうるう年かそうでないかの分岐を発生させるためのIF関数です。
これがなければうるう年(元の日付項目の値が2/29のとき)に計算がずれる可能性があります。
うるう年の条件に関しておさらい
そもそもうるう年が発生するルールが分かっていないと数式化できないのでおさらいです。
僕も調べて気づきましたが単純に4の倍数ではありません。
特に興味ないという方は単純にこの式を使うだけでも大丈夫です。
①4の倍数の年
②100の倍数の年の中で400の倍数である年以外は平年
この2つがルールです。つまり、4の倍数でも例外になる年は存在します。
直近の年で言うと2100年,2200年,2300年はうるう年ではなくなります。
逆に2400年はうるう年です。
これを数式で再現する場合は
- 4の倍数(=4で割り切れる)の年 かつ 100の倍数ではない(=100で割り切れない)の年
もしくは
- 400の倍数(=400で割り切れる)の年
こういった式を作成する必要があります。
主に使うのはOR関数・AND関数・MOD関数です。
割り切れるかどうかの判定をMOD関数を使って行い、それをAND・ORで条件化させます。
元を辿るとこれはIF関数のTrue・Falseの判定の式なので、次に結果の部分の記述をしていきます。
11~16行目(2番目のIF関数)
このIF関数はうるう年であった場合+演算を行う日付項目が2月29日であるか?の分岐を発生させる際のものです。
2月29日にそのまま1年を足そうとすると結果が存在しない日付になるので、そうさせないための処理です。
IF (
MONTH( 日付項目 ) = 2 && DAY( 日付項目 ) = 29,
DATE( YEAR( 日付項目 ) + 『年数』 , MONTH( 日付項目 ) , DAY( 日付項目 ) -1 ) ,
DATE( YEAR( 日付項目 ) + 『年数』 , MONTH( 日付項目 ) , DAY( 日付項目 ) )
)
まずこの関数の条件は2/29であるか?ないか?です。
- 2/29である場合→年数を加算した際に日数を1日減らす
- 2/29でない場合→年数を加算するだけ
これを分岐させて計算しています。また、年数を足す場合はここで年数を追加します。
またYEAR関数・MONTH関数・DAY関数を使っている理由としては日付・時間項目の計算の方法にあります。
前回のこの記事内で処理については触れているので気になる方は覗いてみてください。
また16行目、うるう年でなかった場合も同じ計算なので説明は割愛します。
簡単なまとめ
「ややこしい解説抜きで数式だけコピペしたらいいだろ!」と思う方もいるかも知れませんが
こういったケースを通していろんな関数の使い方に触れていくと臨機応変に式を組めるようになると思います。
簡単な式だと転がっていますが、相手の要望ベースで何かしないといけない時に必要になってくる力だと思うので是非解説も見てみてください。