Spotfire如何计算月末

时间:2015-06-05 15:13:51

标签: spotfire

我在spotfire中有一个公式

萨姆([销售])/ 10000 * 28

但这28只不过是 (EOMONTH(X,-1)-EOMONTH(X,-2))

x只不过是31Mar2015

所以就像当前月份是3月那样,就像月底的月末 - 1月底,我必须填写这个月的所有月份,比如期末是4月那么我们计算no 3月底 - 月份结束之间的几天。任何人都可以帮忙

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修改。

Days of Month reference

编辑:

根据@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