数式での日付値、日付/時間値、および時間値の使用
日時を設定して業務を進める組織では、支払期日、契約期間、その他の機能の管理に日付数式が役立ちます。
必要なエディション
| 使用可能なインターフェース: Salesforce Classic と Lightning Experience の両方 |
| 使用可能なエディション: すべてのエディション |
日付には、Date と Date/Time という 2 種類のデータ型を使用します。1 つのデータ型である Time は、営業時間などの時間を追跡するための日付に依存しません。日付を処理する際に使用する値の大半は Date データ型で、年、月、および日を保存します。CreatedDate などの一部の項目は、日付値だけでなく、時間値も格納する日付/時間項目です (GMT で保存されますが、ユーザーのタイムゾーンの時刻で表示されます)。レポートやレコード詳細ページの日付、日付/時間、および時間項目は、ユーザーのロケールの形式で表示されます。時間値の精度はミリ秒単位です。日付/時間値の精度は秒単位です。
日付値、日付/時間、および時間値で加算や減算などの演算を行えば、将来の日付や 2 つの日付または時間の経過時間を計算できます。たとえば、一方の日付から他方の日付を減算すると、その 2 つの値の差の日数 (Number データ型) が算出されます。2 つの日付/時間値間でこの減算を行った場合は、差が小数値で返され、日、時間、分に換算されます。2 つの時間値間の同じ操作はミリ秒を返します。
たとえば、2 つの日付/時間値の差が 5.52 の場合、2 つの値には、5 日 12 時間 (1 日の 0.5 時間) 28 分 (1 日の 0.02 分) の差があることになります。日付および日付/時間に数値を加算することも可能です。たとえば、TODAY() + 3 という演算では、今日から 3 日後の日付が返されます。日付の処理についての詳細と用例は、「日付数式のサンプル」のリストを参照してください。
どの例でも、実際の日付および日付/時間の項目や値の位置に date 変数と date/time 変数を使用します。
通常、複雑な日付関数は、テキストや数値の数式関数よりサイズが大きくなるため、数式のコンパイルサイズの問題が生じる可能性があります。
TODAY()、NOW()、TIMENOW()
TODAY() 関数では、現在の日、月、および年が Date データ型で返されます。この関数は、以前の日付からの経過日数や一定の日数後の日付を確認する数式や、単に現在の日付を表示する数式で役立ちます。
NOW() 関数では、現時点の日付/時間値が返されます。この関数は、1 日の特定の時間や日付を確認する場合に役立ちます。
TIMENOW() 関数では、日付のない現在の時間を表す値が GMT 形式で返されます。現在の時間、分、秒、ミリ秒が必要な場合、NOW() 関数の代わりにこの関数を使用します。この値は、作業シフトや経過時間などの時間を追跡する場合に便利です。
日付値と日付/時間値間の変換方法についての詳細は、「日付/時間と日付間の変換」を参照してください。
DATE() 関数
DATE() 関数では、指定した年、月、および日の日付値が返されます。数値の Y/M/D 値と、YEAR()、MONTH()、および DAY() 関数は、DATE() の有効なパラメーターです。たとえば、DATE( 2013, 6, 1 ) は 2013 年 6 月 1 日を返します。 同様に、DATE( YEAR( TODAY() ), MONTH( TODAY() ) + 3, 1) は、日付が有効である (たとえば、月が 1 ~ 12 日である) と仮定して、今年の今日から 3 か月後の最初の日の日付値を返します。
入力した Y/M/D 値が無効の日付のときは、DATE() 関数でエラーが返されるため、日付値を処理する場合はエラーチェックも重要です。無効な日付の処理方法は、「日付数式のサンプル」に記載されています。
日付/時間と日付間の変換
Date データ型と Date/Time データ型は代替不能なため、日付値と日付/時間値を含む演算を行う場合は、値を変換してデータ型を揃える必要があります。一部の関数 (YEAR()、MONTH()、DAY() など) も日付値でしか処理できないため、最初に日付/時間値を変換する必要があります。
DATEVALUE( date/time
) 関数を使用すると、日付/時間の日付値が返されます。たとえば、日付/時間から年を取得するには、YEAR( DATEVALUE(
date/time ) ) ) を使用します。
数式が日付/時間項目を参照し、日付を返す場合、時間コンポーネントはユーザーのタイムゾーンに変換されずに無視されます。この動作により、日付が不正確になる可能性があります。ユーザーのタイムゾーンに合わせて修正するには、DATEVALUE()関数を使用して日付/時間フィールドを変換します。
日付値を日付/時間に変換する場合は、DATETIMEVALUE( date ) 関数を使用します。時間は、グリニッジ標準時間 (GMT) の午前 12 時に設定され、レコードが表示された時点でレコードを表示しているユーザーのタイムゾーンに変換されます。ユーザーがサンフランシスコにいる場合、DATETIMEVALUE( TODAY() ) では、当日の午前 12 時ではなく、前日の午後 5 時 (夏時間の場合) が返されます。詳細は、「日付/時間およびタイムゾーンの留意点」を参照してください。
日付/時間と時間間の変換
TIMEVALUE() 関数では、24 時間表示を使用して「HH:MM:SS.MS」 (時間:分:秒.ミリ秒) 形式で Time データ型値が返されます。数値の H/M/S/MS 値と HOUR()、MINUTE()、SECONDS()、および MILLISECONDS() 関数は、TIMEVALUE() の有効なパラメーターです。
TIMEVALUE(value) 関数を使用すると、日付/時間型、テキスト、差し込み項目、式の時間値が返されます。たとえば、TIMEVALUE(ClosedDate) を使用して、ClosedDate 日付/時間値から時間を抽出します。
日付とテキスト間の変換
日付を文字列の一部にする場合は、日付値を TEXT() 関数でラップして、テキストに変換します。たとえば、今日の日付をテキストで返す場合は、次の数式を使用します。
"Today's date is " & TEXT( TODAY() )この数式では、日付がロケール依存の形式ではなく、「YYYY-MM-DD」形式で返されます。形式を変更する場合は、最初に日付から日、月、および年を抽出し、続いて任意の形式で再編します。次に例を示します。
"Today's date is " & TEXT( MONTH( date ) ) & "/" & TEXT( DAY( date ) ) & "/" & TEXT( YEAR( date ) ) ) 他の日付項目や数式でもこのテキストを使用できるように、文字列を日付に変換すること可能です。テキストを「YYYY-MM-DD」形式にする場合は、次の数式を使用して、日付値を返します。
DATEVALUE( "YYYY-MM-DD" )日付/時間とテキスト間の変換
TEXT() 関数を使用すると、文字列に日付/時間値を含めることができますが、タイムゾーンに注意する必要があります。たとえば、次の数式について考えてみます。
"The current date and time is " & TEXT( NOW() )この数式では、NOW() は GMT にオフセットされます。通常、NOW() は表示される時点でユーザーのタイムゾーンに変換されますが、この場合はテキストに変換されているため、この変換が行われません。そのため、サンフランシスコ時間 (GMT-7) の 8 月 1 日午後 5 時にこの数式を実行すると、「現在の日時は、2013–08–02 00:00:00Z です」と表示されます。
日付/時間をテキストに変換すると、末尾に GMT を表す「Z」が付記されます。TEXT( date/time ) は、フィールドが空白の場合に「Z」を返します。そのため、処理する日付/時間値が空白の可能性がある場合は、テキストに変換する前に次の数式で確認します。
IF(
ISBLANK( date/time ),
"",
TEXT( date/time )
)文字列を日付/時間値に変換するには、DATETIMEVALUE() を使用して、「YYYY-MM-DD HH:MM:SS」形式の文字列を渡します。このメソッドでは、GMT の日付/時間値が返されます。
時間とテキスト間の変換
時間を文字列の一部にする場合は、時間値を TEXT() 関数でラップして、テキストに変換します。たとえば、現在の時間をテキストで返す場合は、次の数式を使用します。
"The time is " & TEXT( TIMENOW() )この関数では、「HH:MM:SS.MS」形式で時間が返されます。
他の時間項目や数式でもこの文字列値を使用できるように、テキストを Time データ型に変換することが可能です。24 時間表示の「HH:MM:SS.MS」としてテキストを書式設定します。TIMEVALUE() 関数を使用します。
TIMEVALUE("17:30:45.125")日付/時間およびタイムゾーンの留意点
日付値および日付/時間値は GMT で格納されます。レコードを保存するときは、項目値がユーザーのタイムゾーンから GMT に調整され、その後レコード詳細ページやレポートで表示される時点で閲覧者のタイムゾーンに戻されます。日付に変換することで問題が生じることはありません。日付/時間から日付に変換しても日付値は同じであるためです。
ただし、日付/時間の項目や値を処理する場合、変換は常にユーザーのタイムゾーンではなく、GMT で行われます。標準の日付/時間項目から別の標準の日付/時間を減算する場合は、どちらの項目も同じタイムゾーンのため問題は生じません。他方、計算するいずれかの値が、テキストまたは日付値から日付/時間値に変換されたものである場合には、結果が異なります。
たとえば、サンフランシスコのユーザーが、カスタムの Date_Time_c という日付/時間項目に 2013 年 8 月 2 日午前 12 時の値を入力するとします。太平洋夏時間の時差は GMT-7 のため、この値は 2013–08–02 07:00:00Z として保存されます。 8 月 1 日午後 12 時 (PDT) に、ユーザーがレコードを表示して、次の数式を実行します。
Date_Time_c - NOW()この計算では、NOW() は 2013–08–01 19:00:00Z となり、続いて 2013–08–02 07:00:00Z から減算した 0.5 (12 時間) という予想どおりの結果を返します。
ここで、NOW() の代わりに、文字列「2013–08–01 12:00:00」を日付/時間値に変換するとします。
Date_Time_c - DATETIMEVALUE( "2013-08-01 12:00:00" )この場合、DATETIMEVALUE(
“2013–08–01 12:00:00” ) は 2013–08–01 12:00:00Z で、0.79167 (19 時間) という結果を返します。
数式でユーザーのタイムゾーンを判断する方法はありません。ユーザー全員が同じタイムゾーンにいる場合は、変換した値に、ユーザーのタイムゾーンと GMT の時差を加減算して、タイムゾーンの時差を調整できます。ただし、タイムゾーンに夏時間が適用されることがあり、また夏時間の開始日と終了日が毎年異なるため、この変更を数式で管理することは困難です。日付/時間値とテキストまたは日付値間の変換が必要なトランザクションには、Apex を使用することをお勧めします。

