2

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

ROUND((NOW()-CreatedDate)*1440,0)

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

  • 5,000 个字符限制下的 Salesforce 公式
  • 比较任意两个日期时间字段(不仅仅是 NOW() 与 CreatedDate)
  • 合理的误差范围(+/- 3 小时)
  • 忽略周末
  • 忽略太平洋时间上午 6 点至下午 5 点以外的时间(格林威治标准时间 13:00-23:59)
  • 忽略特定的假期,如 7 月 4 日和 12 月 25 日(对我的需求来说过于复杂)

想只计算工作日数吗?与此处 Salesforce 支持示例建议的模板中的 1,685 个字符相比,此公式使用 873 个编译字符(有些人抱怨在将较大的模板与其他代码组合时超过了 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))
)

阅读我的答案以了解它是如何工作的,以及如何在需要时计算营业时间。

4

4 回答 4

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)

让我们分解一下。我正在计算两个工作日的时间跨度。对于每一个,我都在计算完整的工作周数、最后一个部分周内的完整工作日以及最后一个部分日内的部分工作时间,然后将它们全部加起来。

(5*FLOOR((TODAY()-DATE(1996,01,01))/7)

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

MOD(TODAY()-DATE(1996,01,01), 7)

计算最后部分周中额外的全天数,并为每个计入 1 天。

24/11*(MOD(CreatedDate-DATETIMEVALUE('1996-01-01 13:00:00'), 1))

计算自营业开始以来已过去一天的部分。模数 1 只返回小数部分。乘以 24/11 会将其从小数 24 小时工作日转换为小数 11 小时工作日(对于 8 小时工作日,可以使用 8 而不是 11)。

MIN(1, ...)

确保我们永远不会将在深夜很容易发生的零碎部分记入超过一个完整的工作日。

MIN(5, ...)

确保我们在周六或周日很容易发生的部分工作周中的计入时间不会超过 5 个完整工作日。

ROUND(11*(...), 0)

将其从工作日转换为整个工作时间。将其保留为工作日,包括小数部分。

结束思想:

  • 此公式将工作假期计为工作日。我可以忍受这一点。
  • 当我们的时间跨度与夏令时重叠时,可能会休息一个小时。我可以忍受这一点。
  • 由于我们不计算几个月或几年,我认为我们不受闰年问题的影响。
  • 我尽可能少地使用 DATETIMEVALUE(),因为它过度夸大了公式的大小。
  • 上面的公式是 1,099 个字符,这应该让我有足够的空间为 EMEA 记录使用不同的参考日期。
  • 我不会将它用于 1996 年 1 月 1 日之前的任何日期,但如果您选择更早的星期一,它应该可以正常工作。
于 2012-06-20T22:53:48.800 回答
2

我知道您正在寻找营业时间,但是我注意到您有多个工作日公式,并认为我会在两个日期之间发布此替代工作日数(周一至周五):

1 +
(
 (EndDate__c - StartDate__c) * 5 -
 (MOD(StartDate__c - DATE(1970,1,4),7) - MOD(EndDate__c - DATE(1970,1,4),7)) * 2
) / 7 -
IF(MOD(EndDate__c - DATE(1970,1,4),7) = 6,1,0) -
IF(MOD(StartDate__c - DATE(1970,1,4),7) = 0,1,0)

改编自这个 c# 公式。编译为 479 个字符。

理论上,您可以在此基础上计算小时数,当然可以计算出小时数。

于 2014-10-23T20:01:16.593 回答
0

如果您可以容忍合理的保证金错误

(计算自createdBy date -1以来的工作日数)*(11小时)+(time_now_in_24_hr_format - 6)

于 2012-06-20T21:48:18.830 回答
0

只是关于夏令时 (arrg) 的注释......当考虑到它至关重要时,我会做一个 IF 语句,如果我的源字段(例如 CreatedDate)在夏令时范围之间,我使用一个(调整后)公式的版本,如果不是,我使用未调整的版本。将公式的大小加倍,但相当简单,因为这两个版本仅相差一两个字符。

于 2019-05-07T20:07:19.437 回答