学习目标
- 描述日期和日期/时间类型。
- 解释日期和日期/时间类型之间的区别。
- 描述具有Date和Date / Time返回类型的公式的用例。
- 使用Date和Date / Time类型创建一个公式。
日期和日期/时间公式简介
在管理您的组织时,日期和日期/时间字段非常适合显示联系人的出生日期,个案年龄或创建帐户的日期和时间。您可以使用公式来显示当前日期或查找两个日期之间的差异。
例如,此交叉对象公式将在其相关大小写的页面上将日期和时间创建为日期/时间值。
Account.CreatedDate
通用日期和日期/时间函数和操作符
Salesforce提供了多种功能,可让您更轻松地处理日期和日期/时间值。您可以使用DATEVALUE()函数将日期/时间转换为日期,该函数采用日期/时间或文本值并返回日期。同样,DATETIMEVALUE()接受日期或文本值,并返回日期/时间值,并将时间设置为午夜格林尼治标准时间。
假设您想自定义公式字段显示日期2015年3月17日。您可以使用DATE()函数将日,月和年转换为所需的日期值。
DATE(2015, 03, 17)
DATETIMEVALUE("2015-03-17 17:00:00")
DATEVALUE("2015-03-17")
在公式中使用日期和日期/时间类型
日期值的最简单用法之一是查找两个日期之间的天数。当您从另一个日期值中减去一个日期值时,您将以天数为单位的差异作为数字。
例如,如果您想查找今天的日期和帐户的CreatedDate之间有多少天,请使用:
TODAY() - DATEVALUE(CreatedDate)
- 在安装程序中,使用快速查找框来查找 Object Manager.
- 点击 然后单击 New.
- 选择公式并单击 Next.
- 在 Field Label, 输入 Future Date. 字段名称自动填充。
- 选择 Date 并点击 Next.
- 输入以下公式:
TODAY() + 3
很简单,对吧?当您想要将工作日添加到日期时,情况会变得更加复杂。对于此公式,我们使用CASE()函数向TODAY()添加3个工作日。 CASE()在某些方面与IF()类似。关键的区别在于IF()只检查一个逻辑语句,而CASE()检查一系列称为个案的语句。
CASE(expression,case1,result1,case2,result2,…,else_result)将表达式与case1进行比较。如果它们相等,则返回result1。如果它们不是,则将表达式与case2进行比较,依此类推。如果expression与任何情况都不匹配,则该语句返回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()是星期几。有没有快速的方法来找到星期几与一个内置函数,所以我们使用更先进的技巧。首先我们找到TODAY()和过去已知的星期天之间的天数。接下来我们使用MOD()来查找该数字的余数除以7,给我们一个对应于当前星期几的数字。对于我们的参考星期天,我们使用1900年1月7日,代表DATE(1900,1,7)。
我们的CASE()语句然后根据TODAY()的星期几决定结果。我们的最终公式如下所示:
CASE(
MOD(TODAY() - DATE(1900, 1, 7), 7),
3, TODAY() + 2 + 3,
4, TODAY() + 2 + 3,
5, TODAY() + 2 + 3,
6, TODAY() + 1 + 3,
TODAY() + 3
)
日期和日期/时间示例
- 这个公式通过从下一个月的第一天减去一天来找出一个月的最后一天。
IF( MONTH(Date__c) = 12, DATE(YEAR(Date__c), 12, 31), DATE(YEAR(Date__c), MONTH(Date__c) + 1, 1) - 1 )
- 这个公式找出TODAY()和date_1之间的工作天数,使用类似于我们之前用来查找TODAY()星期几的技巧。首先,公式找出TODAY()与过去已知的星期一(本例中为1900年1月8日)之间的工作日数。我们将该数除以7,然后使用FLOOR()将其从几天转换为几周。然后,我们将它乘以5,将其从几周转换为工作日。该公式找出该金额与date_1与同一参考星期一之间的营业日数之间的差异。结果是TODAY()和Date_c之间的营业日数。
(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 )))
- 此公式使用IF(),AND(),OR()和NOT()将Num_Years__c添加到Date__c中,以确保它不会在闰年中返回2月29日。如果日期是闰年的2月29日,并且未来年不是闰年,则公式将返回到未来一年的3月1日。该公式使用MOD()来检查当前年份是否为闰年。如果一个年份可以被400整除,或者被4整除而不是100,那么它就是一个闰年。否则,这个公式会返回相同的日期。
IF( AND( MONTH(Date__c) = 2, DAY(Date__c) = 29, NOT( OR( MOD(YEAR(Date__c), 400) = 0, AND( MOD(YEAR(Date__c), 4) = 0, MOD(YEAR(Date__c), 100) != 0 ) ) ) ), DATE(YEAR(Date__c) + Num_Years__c, 3, 1), DATE(YEAR(Date__c) + Num_Years__c, MONTH(Date__c), DAY(Date__c) ) )
包含日期和日期/时间公式的常见错误
- 在日期和日期/时间之间转换。日期和日期/时间数据类型不可互换。如果它被写入以返回日期/时间值,则具有日期返回类型的公式不起作用。要在日期和日期/时间之间转换,请使用内置函数DATEVALUE()和DATETIMEVALUE()。请记住,TODAY()将当前日期作为Date值返回,而NOW()将当前日期和时间作为Date / Time值返回。
- 使用时区。日期和日期/时间值始终显示在正在查看它们的用户的时区中。日期/时间值被转换为格林尼治标准时保存的记录,然后在格林尼治时间以外的用户查看时再次转换。将日期转换为日期/时间时,时间始终是午夜格林尼治标准时间。使用TEXT()转换日期/时间值时,请务必考虑时区。将日期/时间转换为文本时,它将以格林尼治标准时间(以GMT结尾处的Z表示)返回时间。 TEXT()总是以GMT时间生成文本值,而不是组织的时区。
- 闰年和无效的日期。当将文本转换为日期或日期/时间值或增加年,月,日的日期或日期/时间,确保您的结果仍然是一个有效的日期。例如,如果公式的结果是2015年6月31日,则公式字段将显示#Error!同样,如果您的公式返回2013年2月29日(非闰年),该字段将显示错误。确保您的配方包含闰年和不同的月份长度。