公式(3)日期

学习目标

完成本单元后,您将能够:

  • 描述日期和日期/时间类型。
  • 解释日期和日期/时间类型之间的区别。
  • 描述具有Date和Date / Time返回类型的公式的用例。
  • 使用Date和Date / Time类型创建一个公式。

日期和日期/时间公式简介

在管理您的组织时,日期和日期/时间字段非常适合显示联系人的出生日期,个案年龄或创建帐户的日期和时间。您可以使用公式来显示当前日期或查找两个日期之间的差异。

例如,此交叉对象公式将在其相关大小写的页面上将日期和时间创建为日期/时间值。

Account.CreatedDate

交叉对象公式显示来自不同对象上的一个对象的数据。在这种情况下,我们显示了case对象上的账户对象的CreatedDate。即使您的组织的成员无权访问字段所在的对象,也可以看到显示或引用跨对象字段的公式。有关交叉对象公式的更多信息,请参阅构建交叉对象公式的技巧

日期表示为日期或日期/时间值。日期值存储年,月和日。日期/时间值存储年,月,日和时间。时间存储为GMT,但显示在查看它的用户的时区中。在公式中处理日期/时间值时,将时区冲突保留在头脑中非常重要。时区混淆很容易导致公式字段中的逻辑错误和组织中的错误信息。

如果您减去两个日期值,则结果是整数。如果您减去两个日期/时间值,则结果为代表天数,小时数和分钟数的十进制值。例如,如果两个日期/时间值之间的差值是3.52,则两个日期之间有3天,12小时(一天的0.5天)和29分钟(一天的0.02天)。

通用日期和日期/时间函数和操作符

Salesforce提供了多种功能,可让您更轻松地处理日期和日期/时间值。您可以使用DATEVALUE()函数将日期/时间转换为日期,该函数采用日期/时间或文本值并返回日期。同样,DATETIMEVALUE()接受日期或文本值,并返回日期/时间值,并将时间设置为午夜格林尼治标准时间。

假设您想自定义公式字段显示日期2015年3月17日。您可以使用DATE()函数将日,月和年转换为所需的日期值。

DATE(2015, 03, 17)
DATETIMEVALUE()是将文本转换为与2015年3月17日格林尼治标准时间下午5点对应的日期/时间值的另一种方法。
DATETIMEVALUE("2015-03-17 17:00:00")
你也可以使用DATEVALUE(),它接受一个字符串并返回一个日期值。
DATEVALUE("2015-03-17")
注意

DATETIMEVALUE()采用日期或文本值,格式为YYYY-MM-DD,格林尼治时间为GMT。如果输入的值超出有效范围(例如2月29日的非闰年或大于12的月份),则公式字段会显示#Error!

要查找当前日期作为日期值,请使用TODAY()。要查找当前时刻为日期/时间值,请使用NOW()。这些功能对于查找将来或过去的日期或距今天另一日期有多少天有用。

要将日期值中的日,月或年作为数字,分别使用DAY(),MONTH()或YEAR()。

在公式中使用日期和日期/时间类型

日期值的最简单用法之一是查找两个日期之间的天数。当您从另一个日期值中减去一个日期值时,您将以天数为单位的差异作为数字。

例如,如果您想查找今天的日期和帐户的CreatedDate之间有多少天,请使用:

TODAY() - DATEVALUE(CreatedDate)
注意

请小心减去将来日期的过去日期。如果您逆转公式-DATEVALUE(CreatedDate) – TODAY() – 它将返回负值。

请注意,我们使用DATEVALUE()将CreatedDate(日期/时间值)转换为日期值,从而允许我们从TODAY()中减去CreatedDate。日期和日期/时间值不兼容。您不能从一个日期/时间减去一个日期,或者从一个日期减去一个日期/时间,而无需先转换其中一个值。

您还可以将日期添加到日期。要创建一个公式,它返回今天后三天的日期:

  1. 在安装程序中,使用快速查找框来查找 Object Manager.
  2. 点击 Account | Fields & Relationships 然后单击 New.
  3. 选择公式并单击 Next.
  4. Field Label, 输入 Future Date. 字段名称自动填充。
  5. 选择 Date 并点击 Next.
  6. 输入以下公式:
    TODAY() + 3

    注意

    将日期添加到日期时,Salesforce会在小数点后忽略数字。所以TODAY()+ 3相当于TODAY + 3.4,而TODAY()+ 2相当于TODAY()+ 2.9。

很简单,对吧?当您想要将工作日添加到日期时,情况会变得更加复杂。对于此公式,我们使用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
)
您可以使用此公式的变体将任意数量的工作日添加到日期。无论您添加多少个工作日,最多有七个案例,一个星期中的每一天。

日期和日期/时间示例

  1. 这个公式通过从下一个月的第一天减去一天来找出一个月的最后一天。
    IF(
      MONTH(Date__c) = 12,
      DATE(YEAR(Date__c), 12, 31),
      DATE(YEAR(Date__c), MONTH(Date__c) + 1, 1) - 1
    )
  2. 这个公式找出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 )))
  3. 此公式使用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日(非闰年),该字段将显示错误。确保您的配方包含闰年和不同的月份长度。