我们有时需要在当前对象上通过公式字段来引用其他关联对象上的字段值,这种跨越两个及以上的对象的公式我们称为跨对象公式。
可以在当前对象上配置“相关表”或“主表/子表”类型的字段来引用其他对象,相关规则请参考之前“主键/外键字段”部分,跨对象公式就是通过在公式中引用当前对象上这两种字段型,然后进一步引用其关联对象上的字段来实现跨对象公式。
跨对象公式一般形如fieldNameA.fieldNameB
,其中fieldNameA
是当前对象上的“相关表”或“主表/子表”字段名称,fieldNameB
是fieldNameA
字段关联到的对象上的某个字段名称,比如联系人对象上有一个名为“所属客户”(account)
的“主表/子表”字段,引用了对象“业务伙伴”(accounts)
,我们可以在联系人对象定义一个公式字段来输出联系人所属客户的网址,该公式字段的公式表达式应该配置为account.website
。
可以在跨对象公式中用点符号连接各级对象上的外键字段以形成引用链,理论上支持无限层次的引用,但是出于性能考虑请避免引用层级过多,比如上面提到的联系人对象上可以配置公式account.created_by.name
表示输出联系人所属客户的记录创建人的名称。
需要注意的是,跨对象公式最后一个引用链不可以是外键字段,即不可以是相关表”或“主表/子表”类型的字段,比如上面提到的联系人对象上的公式如果配置为account.created_by
是表示输出联系人的创建人,但是这是不合法的,因为created_by
是一个外键字段,它指向了关联创建人整条记录,而不是只输出关联创建人的某个字段值,所以正确的写法是需要再向created_by
这个外键字段进一步扩展引用其下一级对象的字段,比如上面提到的account.created_by.name
就是一个合法的跨对象公式。
如果是想让公式输出外键字段值本身,可以在最后扩展引用下其关联对象的主键字段(即_id
)即可,也就是把公式表达式写成account.created_by._id
就可以输出联系人所属客户的创建人_id
值。
公式在服务端执行,因此可以在公式中引用当前记录相关表中的数据。
例如以下语法可以引用付款记录对应的合同记录对应的客户名称。
payment.contract.account.name
日期使用了两种数据类型:日期和日期时间。数据类型时间不包括日期值,例如工作时间。处理日期时使用的大部分值都是日期数据类型,存储年、月和日。CreatedDate 等一些字段是日期时间字段,意味着它们不仅存储日期值,而且还存储时间值(以 GMT 存储,但以用户的时区显示)。当在记录详细信息页面查看时,日期、日期时间和时间字段以用户的区域设置格式化。时间值的精度以毫秒为单位。日期时间值的精度以秒为单位。
您可在日期、日期时间和时间值上使用加和减等运算符,以计算未来日期或两个日期或时间之间的已过去的时间。例如,如果您将一个日期减去另一个日期,由此得出的值将是两个初始值之差(天)(数字数据类型)。两个日期时间值之间的同一操作将返回十进制值,表示天、小时和分钟数之差。两个时间值的相同操作会返回毫秒。
例如,如果两个日期时间值之差是 5.52,这意味着两个值分隔 5 天、12 小时(1 天的 0.5)和 28 分钟(1 天的 0.02)。您还可以添加数字值到日期和日期时间。例如,操作 TODAY() + 3
将返回今天日期后的三天。
在整个示例中,使用了变量日期和日期时间以代替实际日期和日期时间字段或值。
有关如何在日期值和日期时间值之间转换的详细信息,请参阅 在日期时间和日期之间转换
DATE() 函数返回日期值,给定年、月和日。数字 Y/M/D 值和 YEAR()、MONTH() 和 DAY() 函数是 DATE() 的有效参数。例如,DATE( 2013, 6, 1 )
返回2013 年 6 月 1 日。同样,DATE( YEAR( TODAY() ), MONTH( TODAY() ) + 3, 1)
返回当年今天起三个月的第一天的日期值,假定该日期有效(例如,月份在 1 和 12 之间)。
如果输入的 Y/M/D 值导致无效的日期,DATE() 函数并不会报错,而是会返回一个可能错误的值,比如非闰年的DATE(2021,2,29)将返回2021-03-01,DATE(2021,121,29)将返回2031-01-29,因此错误检查是使用日期值的重要部分。您可在示例日期格式中阅读有关处理无效日期的方法。
日期和日期时间是不可交换的数据类型,因此在日期和日期时间值之间执行操作时,您需要转换这些值,使它们具有相同的类型。一些函数(如 YEAR()
、MONTH()
和 DAY()
)还仅适用于日期值,因此必须首先转换日期时间值。
使用 DATEVALUE( datetime )
函数返回日期时间的日期值。例如,要从日期时间获取年,使用 YEAR( DATEVALUE( datetime ) )
。
您可以使用 DATETIMEVALUE( TEXT(date) )
函数将日期值按GMT时区转换为日期时间。时间将设置为格林威治标准时间 (GMT) ,然后显示时会按用户所有时区显示。对于北京时间,DATETIMEVALUE( TEXT(TODAY()) )
将返回当天的utc0点,管理后台界面上将显示为当天的上午8:00而不是当天的 00:00。有关详细信息,请参阅有关日期时间和时区的备注
TIMEVALUE() 函数返回的时间数据类型值的格式为 24 小时制的“HH:MM:SS.MS”(hours:minutes:seconds.milliseconds)
数字 H/M/S/MS 值和 HOUR()、MINUTE()、SECOND() 和 MILLISECOND() 函数是 TIMEVALUE() 的有效参数。
使用 TIMEVALUE(text) 函数,把文本值、文本类型合并字段或表达式转换为时间类型。例如,使用 TIMEVALUE(LPAD(TEXT(HOUR(ClosedDate)), 2, "0") & ":" & LPAD(TEXT(MINUTE(ClosedDate)), 2, "0") & ":" & LPAD(TEXT(SECOND(ClosedDate)), 2, "0") & "." & LPAD(TEXT(MILLISECOND(ClosedDate)), 3, "0"))
从 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() 将在查看时转换成用户的时区,但由于被转换为文本,因此转换不会发生。因此,如果您在 8 月 1 日北京时间 (GMT-10) 下午6点 执行本公式,结果是“The current date and time is 2021-08-01 10:00:00Z”。
当将日期时间转换为文本时,将在最后包含“Z”以表示 GMT。
要将字符串转换为日期时间值,使用 DATETIMEVALUE() 将以“YYYY-MM-DD HH:MM:SS”的格式传输字符串。本方法将返回 GMT 的日期时间值。
如果您想要将时间作为字符串的一部分包含,在 TEXT() 函数中封装时间值,以将其转换为文本。例如,如果您想要将当前时间返回为文本,使用: "The time is " & TEXT( TIMENOW() )
此函数会返回格式为“HH:MM:SS.MS”的时间。
您也可以将文本转换为时间数据类型,以便将字符串值与其他时间字段和公式一起使用。按 24 小时制将文本格式化为“HH:MM:SS.MS”。使用 TIMEVALUE() 函数: TIMEVALUE("17:30:45.125")
日期和日期时间值以 GMT 存储。保存好记录后,字段值存储为 GMT时区下的值,然后在记录详细信息页面显示时以查看者的时区显示。不会因日期转换而造成问题,因为转换日期时间为日期会得到相同的日期值。
然而,当使用日期时间值时,转换始终以 GMT 而不是用户的时区完成。如果在两个日期时间字段之前比较不会有时区问题,因为这两个字段都在同一时区。然而,当计算中的一个值从文本或日期值转换为日期时间值时,结果将不同。
让我们假定北京用户在名为 Date_Time_c 的自定义日期时间字段输入 2020 年 8 月 2 日 9点的值。该值被存储为 2020-08-02 01:00:00Z,因为存在 GMT+8的时区差。在北京时间 8 月 2 日21:00,用户编辑记录时运行以下公式字段: Date_Time_c - NOW()
在计算中,NOW() 是 2020-08-02 13:00:00Z,然后从 2020-08-02 01:00:00Z 相减会返回 -0.5(-12 小时)的预期结果。
假定不使用 NOW(),公式将转换字符串“2020-08-02 21:00:00”为日期时间值: Date_Time_c - DATETIMEVALUE( "2020-08-02 21:00:00")
在这种情况下,DATETIMEVALUE( "2020-08-02 21:00:00")是 2020-08-02 21:00:00Z,最后运算结果会返回-0.8333333333333334(-20小时),与之前的-12小时不同。
假定当前时间还是北京时间2020年11月10日21点,即2020-11-10T13:00:00Z,把上面的NOW换为当天日期函数TODAY: TODAY() - DATEVALUE("2020-11-10T19:00:00Z")
运算结果为0,因为减号左右两侧都是北京时间11月10号,但是如果假定当前时间为北京时间2020年11月10日早上7点的话,因为北京时间时区差8小时,TODAY()将输出为2020-11-09号,两者相减将得到-1(-24小时)。
无法在公式中确定用户的时区。如果您的所有用户都在同一时区,则可以通过加或减用户的时区和 GMT 之间的时差以调整时区差别为您的已转换值。然而,由于时区会受夏令时的影响,同时每年的 DST 开始和结束日期都不同,因此很难在公式中管理。