Salesforce公式:计算两个日期之间的营业时间

twa*_*ley 2 salesforce

我可以使用如下公式轻松计算导致的年龄(以分钟为单位):

ROUND((NOW()-CreatedDate)*1440,0)
Run Code Online (Sandbox Code Playgroud)

但是,我只想计算该时间跨度的营业时间(实际上是分钟).我想在Salesforce公式(不是顶点触发器)中执行此操作.我在这里这里找到了一些灵​​感.我对此解决方案的优先级:

  • Salesforce公式低于5,000个字符
  • 比较任何两个日期时间字段(不仅仅是NOW()和CreatedDate)
  • 合理的误差范围(+/- 3小时)
  • 忽略周末
  • 忽略太平洋时间早上6点至下午5点(格林尼治标准时间13:00-23:59)
  • 忽略7月4日和12月25日这样的特定假期(根据我的需要过于复杂)

想要算一下工作日数量?这个公式在873个编译字符中进行比较,相比之下Salesforce Support 示例中建议的模板中的1,685个(有些人抱怨在较大模板与其他代码组合时超过5,000个字符限制).

(
    5*FLOOR((TODAY()-DATE(1996,01,01))/7) + 
    MIN(5, MOD(TODAY()-DATE(1996,01,01), 7))
) - (
    5*FLOOR((DATEVALUE(CreatedDate)-DATE(1996,01,01))/7) + 
    MIN(5, MOD(DATEVALUE(CreatedDate)-DATE(1996,01,01), 7))
)
Run Code Online (Sandbox Code Playgroud)

阅读我的答案,了解它是如何工作的,以及如果您需要它甚至可以计算营业时间.

twa*_*ley 5

我通过计算两个不同日期的参考点两次的工作日来解决这个问题,然后减去它们之间的工作日数,包括小数部分,这样我就可以轻松地将其转换为营业时间或营业时间.通过在过去的星期一(例如1996年1月1日)选择参考点作为业务开始,我可以更容易地计算数学并解决Salesforce公式的限制.

举个例子,假设我有两个日期,D1 ="5/10/2012 12:49 PM"和D2 ="6/20/2012 14:19 PM".我的工作周是5天/周x 10小时/天.我随意选择参考日期为"2012-04-02 13:00:00".从参考日算起,到D1有28.682个工作日,到D2有57.832个工作日.减去我给出了D2和D1之间29.150个工作日的正确答案.

以下是计算营业时间内任何Salesforce记录的年龄的公式(从格林威治标准时间1300开始的11小时):

ROUND(11*(
(5*FLOOR((TODAY()-DATE(1996,01,01))/7) +
MIN(5, 
    MOD(TODAY()-DATE(1996,01,01), 7) +
    MIN(1, 24/11*(MOD(NOW()-DATETIMEVALUE('1996-01-01 13:00:00'), 1)))
))
-
(5*FLOOR((DATEVALUE(CreatedDate)-DATE(1996,01,01))/7) +
MIN(5, 
    MOD(DATEVALUE(CreatedDate)-DATE(1996,01,01), 7) +
    MIN(1, 24/11*(MOD(CreatedDate-DATETIMEVALUE('1996-01-01 13:00:00'), 1)))
))
), 0)
Run Code Online (Sandbox Code Playgroud)

让我们分解吧.我正在计算两个工作日时间.对于每个我计算完整工作周的数量,在最后一个部分周内的完整工作日,以及在最后一个部分日内的小数营业时间,然后将其全部添加.

(5*FLOOR((TODAY()-DATE(1996,01,01))/7)
Run Code Online (Sandbox Code Playgroud)

计算自参考点(必须是星期一)以来的整周数,并为每个工作日计算5个工作日.

MOD(TODAY()-DATE(1996,01,01), 7)
Run Code Online (Sandbox Code Playgroud)

计算最后一个部分周的额外完整天数,并为每个部分计算1天.

24/11*(MOD(CreatedDate-DATETIMEVALUE('1996-01-01 13:00:00'), 1))
Run Code Online (Sandbox Code Playgroud)

计算自业务开始以来已过去的一天的部分.模数1仅给出小数部分.乘以24/11将其从24小时工作日转换为11小时工作日(可以使用8而不是11小时,每天工作8小时).

MIN(1, ...)
Run Code Online (Sandbox Code Playgroud)

确保我们永远不会在一个完整的工作日内为小部件提供信贷,这可能很容易发生在傍晚.

MIN(5, ...)
Run Code Online (Sandbox Code Playgroud)

确保我们永远不会超过5个完整工作日的部分工作周,这可能很容易发生在周六或周日.

ROUND(11*(...), 0)
Run Code Online (Sandbox Code Playgroud)

将此信息从工作日转换为整个工作时间.在工作日(包括小数部分)将其关闭.

结束思路:

  • 此公式将商务假期计为工作日.我可以忍受这一点.
  • 当我们的时间跨度与夏令时变化重叠时,可能需要一小时.我可以忍受这一点.
  • 由于我们没有计算数月或数年,我认为我们对闰年问题免疫.
  • 我尽可能少地使用DATETIMEVALUE(),因为它过度膨胀了公式的大小.
  • 上面的公式是1,099个字符,这应该给我足够的空间来为EMEA记录使用不同的参考日期.
  • 我不打算在1996年1月1日之前的任何日期使用它,但是如果你选择一个更老的星期一它应该可以正常工作.