日付、日付/時間、時間数式の使用
学習の目的
日付、日付/時間、時間数式の概要
組織の管理において、日付項目や日付/時間項目は、取引先責任者の生年月日や、ケースの対応期間、取引先の作成日時などを表示するうえで役立ちます。時間項目は、営業時間などクロック時間の追跡に適しています。数式を使用して、現在の日付または時間を表示したり、2 つの日付または時間の差を算出したりすることができます。
Account.CreatedDate
クロスオブジェクト数式は、あるオブジェクトのデータを別のオブジェクトに表示します。この場合は、取引先オブジェクトの CreatedDate をケースオブジェクトに示します。組織のメンバーは、項目が存在するオブジェクトへのアクセス権がなくても、クロスオブジェクト項目を表示または参照する数式を確認できます。クロスオブジェクト数式についての詳細は、「クロスオブジェクト数式の作成のヒント」を参照してください。
日付は、日付値と日付/時間値のいずれかで示されます。日付値は、年、月、日を格納します。日付/時間値は、年、月、日、時間を格納します。時間は GMT で格納されますが、ユーザが参照しているタイムゾーンで表示されます。ここで重要な点は、数式に日付/時間値を使用するときに、タイムゾーンの変換を念頭に置いておくことです。タイムゾーンを間違えると、数式項目で論理エラーが簡単に生じ、組織に誤った情報が示される可能性があります。
2 つの日付値間で減算を行った場合、結果は整数になります。2 つの日付/時間値間で減算を行った場合は、結果が小数値で、日、時間、分を示します。たとえば、2 つの日付/時間値の差が 3.52 の場合、2 つ日付の間には 3 日間と 12 時間 (1 日× 0.5) 29 分 (1 日× 0.02) の差があることになります。
2 つの時間値で減算を行った場合、結果はミリ秒単位で、常に正の値になります。
TimeField1__c の値が 10:00 PM で、TimeField2__c の値が 9:00 PM の場合
TimeField1__c - TimeField2__c = 3600000
結果が負の数値になることはありません。減算では 2 つの時間値の経過時間が 24 時間表示で示されます。
日付、日付/時間、時間の一般的な関数および演算子
Salesforce では、日付、日付/時間、時間値をより簡単に処理できるようにいくつかの関数を用意しています。日付/時間を日付に変換する場合は、DATEVALUE() 関数を使用します。この関数は、日付/時間またはテキスト値を取り、日付を返します。同様に、DATETIMEVALUE() は、日付またはテキスト値を取り、日付/時間値を返します (時間は GMT の午前 0 時に設定されます)。そして、日付/時間またはテキスト値を時間に変換する場合は、TIMEVALUE() 関数を使用します。
DATE(2015, 03, 17)
DATETIMEVALUE("2015-03-17 17:00:00")
DATEVALUE("2015-03-17")
現在の日を確認して日付値にするには、TODAY() を使用します。現在の時点を確認して日付/時間値にするには、NOW() を使用します。これらの関数は、将来または過去の日付を見つける場合や、今日から別の日付までの日数を算出する場合に役立ちます。
日付値から日、月、年を数字で取得するには、それぞれ DAY()、MONTH()、YEAR() を使用します。
TIMEVALUE("17:30:00.000")
MINUTE(TIMENOW())
数式での日付型、日付/時間型、時間型の使用
日付値の最も簡単な用途の 1 つが、2 つの日付間の日数を算出することです。ある日付値から別の日付値を減算すれば経過日数がわかります。
TODAY() - DATEVALUE(CreatedDate)
ここでは、DATEVALUE() を使用して、日付/時間値の CreatedDate を日付値に変換して、TODAY() から CreatedDate を減算できるようにします。日付値と日付/時間値には互換性がありません。事前にいずれかの値を変換しなければ、日付/時間から日付を減算することや、日付から日付/時間を減算することはできません。
また、日付に日数を加算することもできます。今日の 3 日後の日付を返す数式を作成する手順は、次のとおりです。
- [設定] で、[クイック検索] ボックスを使用して [オブジェクトマネージャ] を検索します。
- [取引先] | [項目とリレーション] をクリックし、[新規] をクリックします。
- [数式] を選択して、[次へ] をクリックします。
- [項目の表示ラベル] に、「Future Date」 (将来の日付) と入力します。[項目名] は自動入力されます。
- [日付] を選択して、[次へ] をクリックします。
TODAY() + 3
簡単でしょう? 日付に営業日数を加算する場合は、若干複雑になります。この数式の場合は、CASE() 関数を使用して、TODAY() に 3 営業日を加算します。CASE() はいくつかの点で IF() と似ています。主な違いは、IF() が 1 つの論理ステートメントのみをチェックするのに対し、CASE() はケースという一連のステートメントを確認することです。
CASE(expression, case1, result1, case2, result2, ... , else_result) は、expression を case1 と比較します。一致した場合は、result1 を返します。一致しない場合は、expression を case2 と比較し、この処理を繰り返します。式がどのケースとも一致しない場合は、ステートメントが else_result を返します。
CASE() は、結果の選択肢が多数ある条件ステートメントに適しています。通常はネストされた IF() ステートメントでも同じことができますが、CASE() を使用したほうが複雑な数式が読みやすくなり、理解しやすくなります。
ここでは CASE() を使用して、TODAY() に 3 営業日を加算する数式を記述します。CASE() を使用する場合の最初のステップは、ケースについて検討することです。この例の数式では、いくつかの異なる状況が考えられます。
- TODAY() が日曜日、月曜日、火曜日の場合は、3 営業日の加算が TODAY() + 3 になります。
- TODAY() が水曜日、木曜日、金曜日の場合は、3 営業日の加算が TODAY() + 5 (営業日 3 日と週末 2 日) になります。
- TODAY() が土曜日の場合は、3 営業日の加算が TODAY() + 4 (営業日 3 日と週末 1 日) になります。
この例の数式を機能させるためには、TODAY() が何曜日かを知る必要があります。WEEKDAY() 関数を使用して曜日を確認します。
CASE( WEEKDAY(TODAY()), 4, TODAY() + 2 + 3, 5, TODAY() + 2 + 3, 6, TODAY() + 2 + 3, 7, TODAY() + 1 + 3, TODAY() + 3 )
この数式のバリエーションを使用すれば、日付に任意の営業日数を加算できます。ケースは曜日ごとに 1 つのため、追加する営業日数に関係なく最大 7 つです。
時間値にも算術演算を実行できます。
時間値の加算または減算の単位はミリ秒です。
Timefield1__c の値が 5:00 PM の場合
- Timefield1__c + 600000 は 5:10 PM になります。
- Timefield1__c - 600000 は 4:50 PM になります。
時間項目には日付が含まれません。そのため、時間値に 25 時間加算することは、1 時間加算することと同じです。24 時間を超えると、クロックが元に戻ります。
数式で 1 つの時間項目から別の時間項目を減算する場合、結果はミリ秒単位で表示され、負の数値になることはありません。
(ClosedTime - OpenTime) / 3600000
そして、以下の時間の場合は、次の結果を取得します。
ClosedTime = 5:00 PM で OpenTime = 8:00 AM の場合、ClosedTime - OpenTime は 9 時間。
ClosedTime = 5:00 AM で OpenTime = 7:00 AM の場合、ClosedTime - OpenTime は 22 時間。
Shift_Ends_Time__c >= (Shift_Start_Time__c + 14400000)
日付、日付/時間、時間の例
- 次の数式は、翌月の初日から 1 日を減算して、月の最終日を示します。ADDMONTHS() 関数を使用して、減算する前に各翌月を計算しています。
DATE(YEAR(ADDMONTHS(Date__c,1)), MONTH(ADDMONTHS(Date__c,1)), 1) - 1
- 次の数式は、今日より前の Date_c から TODAY() までの営業日数を確認します。最初に、過去の既知の月曜日 (この場合は 1900 年 1 月 8 日) から TODAY() までの営業日数を算出します。この日数を 7 で除算し、FLOOR() を使用して日から週に変換します。次に、その週数に 5 を乗算して、週から営業日に変換します。そして、その日数と、同じ参照月曜日から Date_c までの営業日数の差を算出します。この結果が、過去の Date_c から TODAY() までの営業日数です。
(5 * (FLOOR((TODAY() - DATE(1900, 1, 8)) / 7)) + MIN(5, MOD(TODAY() - DATE(1900, 1, 8), 7))) - (5 * (FLOOR((Date__c - DATE(1900, 1, 8)) / 7)) + MIN(5, MOD(Date__c - DATE(1900, 1, 8), 7 )))
ADDMONTHS(Date__c, Num_Years__c * 12)
- ケースのこの数式は、担当者が顧客の希望時刻に電話をかけているかどうかを確認します。[希望時刻] 項目は、取引先責任者がアウトバウンドケースに関する連絡希望時刻として指定した時間を表します。TIMEVALUE() は GMT タイムゾーンで値を返すため、この数式の -7 は、値を取引先責任者のタイムゾーンである PDT に変換します。
IF( IF((HOUR(TIMEVALUE(CreatedDate)) - 7) < 0, 24 + (HOUR(TIMEVALUE(CreatedDate)) -7), (HOUR(TIMEVALUE(CreatedDate)) - 7)) = HOUR(Contact.Preferred_Time__c), TRUE, FALSE)
日付、日付/時間、時間数式の一般的なエラー
- 日付、日付/時間、時間の変換。日付、日付/時間、時間データ型は代替不能です。戻り値のデータ型が日付である数式を、日付/時間値を返すように記述した場合、この数式は機能しません。日付、日付/時間、時間を変換するには、DATEVALUE()、DATETIMEVALUE()、TIMEVALUE() の組み込み関数を使用します。TODAY() は現在の日付を日付値で返し、NOW() は現在の日時を日付/時間値で返します。そして TIMENOW() は現在の日時を時間値で返します。
- タイムゾーンの使用。日付、日付/時間、時間値は常に、参照しているユーザのタイムゾーンで表示されます。日付/時間値は、レコードの保存時に GMT に変換されて格納され、GMT 以外のユーザが参照するときは再度変換されます。日付を日付/時間に変換する場合、時間は常に GMT 午前 0 時になります。TEXT() を使用して日付/時間値を変換するときは、タイムゾーンに注意します。日付/時間をテキストに変換すると、GMT 時間が返され、値の末尾に Z が付記されます。TEXT() は常に、テキスト値を組織のタイムゾーンではなく、GMT 時間で生成します。時間値には関連付けられているロケールやタイムゾーンがなく、異なるタイムゾーンのユーザ間で変換されません。TIMEVALUE() を使用して日付/時間を時間に変換する場合は、GMT 値が返されます。
- うるう年および無効な日付。テキストを日付や日付/時間値に変換する場合、または日付や日付/時間に日数、月数、年数を加算する場合は、結果が有効な日付であることを確認します。たとえば、数式の結果が 2015 年 6 月 31 日の場合は、数式項目に #Error! が表示されます。同様に、数式が 2013 年 (うるう年ではない年) 2 月 29 日を返すと、項目にエラーが表示されます。数式がうるう年や各月の日数に対応していることを確認します。