我在spotfire中有一个公式
萨姆([销售])/ 10000 * 28
但这28只不过是 (EOMONTH(X,-1)-EOMONTH(X,-2))
x只不过是31Mar2015
所以就像当前月份是3月那样,就像月底的月末 - 1月底,我必须填写这个月的所有月份,比如期末是4月那么我们计算no 3月底 - 月份结束之间的几天。任何人都可以帮忙
答案 0 :(得分:2)
如果你需要的只是delta值,我们可以简化这个。如果我错了,请纠正我,但是在一个月结束时减去另一个月的EOM实际上只是第一个月的天数。
E.g。三月的输入然后我将调查二月,看到它是28天(除非闰年然后是29)。不需要进行EOMONTH-EOMONTH计算,因为这些日历值在闰年之外是静态的。
以下是一个应该提供所需价值的spotfire表达式。我还包括一些模数逻辑来处理闰年(如果当前月份是3月那么检查闰年。如果是,那么结果= 29,否则28。)
Case
when Month(DateTimeNow()) = 1 then 31
when Month(DateTimeNow()) = 2 then 31
when Month(DateTimeNow()) = 3 and Mod(Year(DateTimeNow()),4)=0
and (Mod(Year(DateTimeNow()),100)!=0 or Mod(Year(DateTimeNow()),400)=0) then 29
when Month(DateTimeNow()) = 3 then 28
when Month(DateTimeNow()) = 4 then 31
when Month(DateTimeNow()) = 5 then 30
when Month(DateTimeNow()) = 6 then 31
when Month(DateTimeNow()) = 7 then 30
when Month(DateTimeNow()) = 8 then 31
when Month(DateTimeNow()) = 9 then 31
when Month(DateTimeNow()) = 10 then 30
when Month(DateTimeNow()) = 11 then 31
when Month(DateTimeNow()) = 12 then 30
end
如果您实际上不需要当月并且有输入列,则可以替换Month(DateTimeNow())。另外,您可以将结果计算Sum([sales])/10000*28
添加到上面,或者只是将上面的公式引用作为计算列插入:Sum([sales])/10000*[calc_col]
如果您有任何疑问,请告诉我。
供参考:
没有凌乱的Spotfire代码的闰年逻辑:
if( 0 == year % 4 and (0 != year % 100 or 0 == year % 400) )
{
# Then year is a leap year.
}
从this perl code修改。
编辑:
根据@Niko,如果我们不使用闰年逻辑,我们可以稍微清理一下代码。实际上,这取决于此解决方案的闰年逻辑的必要性。
Case Month(DateTimeNow())
when 1 then 31
when 2 then 31
when 3 then 28
when 4 then 31
when 5 then 30
when 6 then 31
when 7 then 30
when 8 then 31
when 9 then 31
when 10 then 30
when 11 then 31
when 12 then 30
end
答案 1 :(得分:1)
我在本月的第一天,加一个月,休息一天。
使用DateAdd( '日', - 1,日期(年(DateTimeNow()),月(DATEADD( '月',1,DateTimeNow())),1))
DateTimeNow()可以替换为日期列。
一旦你有一个特定日期的月份的最后一天,你可以提取日(/上面的表达式/)
答案 2 :(得分:0)
回到了这里。我把@ clesiemo3的答案缩小了一点:
CASE
WHEN Month([Date]) IN (1, 3, 5, 7, 8, 10, 12) THEN 31
WHEN Month([Date]) IN (4, 6, 9, 11) THEN 30
WHEN (Month([Date])=2) AND (Mod(Year([Date]),4)=0)
AND ((Mod(Year([Date]),100)!=0) or (Mod(Year([Date]),400)=0)) THEN 29
ELSE 28
END