我需要为日期字段创建公式。 新日期字段ID
的公式新日期字段=旧日期字段+没有月份
月数来自选项列表。
答案 0 :(得分:1)
这个简单的要求暴露了salesforce公式语言的一些限制。即,下面的公式(基于this)将起作用,但它非常不优雅,并且几乎不适合允许的脚本大小。希望其他人有更好的解决方案。
DATE(
year(BaseDate) + floor((month(BaseDate) + Add_Months__c)/12)
+ if(and(month(BaseDate)=12,Add_Months__c>=12),-1,0),
if( mod( month(BaseDate) + Add_Months__c , 12 ) = 0, 12 , mod( month(BaseDate) + Add_Months__c , 12 )),
min(
day(BaseDate),
case(
max(
mod(
month(BaseDate) + Add_Months__c , 12
) ,
1
),
9,30,
4,30,
6,30,
11,30,
2,28,
31
)
)
)
答案 1 :(得分:1)
直接从选项列表中提取值(如果不是不可能)将非常困难。显然,将选项列表值转换为数字会导致大幅增加。以下公式将做你想做的事情
DATE(
FLOOR((MONTH(CalcDate__c) + VALUE(TEXT(AddMonths__c))) / 12) + YEAR(CalcDate__c),
MOD((MONTH(CalcDate__c) + VALUE(TEXT(AddMonths__c))), 12),
1) + (DAY(CalcDate__c) - 1)
CalcDate__c
是原始日期,AddMonths__c
是您的选择列表。
该公式确实附带了警告,它有时会滚动到下个月(例如,添加1个月到2011年3月31日将产生5/1/2011而不是4/30/2011)。如果您需要解决这个问题,可以使用杰里米答案中的CASE
语句。
该公式的另一个问题是,遗憾的是, 5.7k 字符超过了最高5k。
但是,您可以首先创建一个工作流程规则,将选项列表值复制到隐藏的数字字段中,然后使用编译后的大小为 1.9k 的公式:
DATE(
FLOOR((MONTH(CalcDate__c) + AddMonths2__c) / 12) + YEAR(CalcDate__c),
MOD((MONTH(CalcDate__c) + AddMonths2__c), 12),
1) + (DAY(CalcDate__c) - 1)
在这种情况下,AddMonths2__c
是AddMonths__c
的数字副本。
此公式将保存在Salesforce中并且应该实现您要执行的操作(尽管它与第一个公式具有相同的月末翻转)