水壶Datedif月问题

时间:2017-05-02 12:27:29

标签: pentaho kettle

我需要在R编程语言中重现水壶Datedif功能。我需要'datedif month'选项。我认为复制很容易,但我在pentaho中有一些“奇怪的行为”。举个例子:

ID date_1 date_2 monthly_difference_kettle daydiff_mysql

15943 31/12/2013 28/07/2014 7 209

15943 31/12/2011 27/07/2012 6 209

所以在pentaho水壶中我使用了公式步骤和函数DATEDIF(date2,date1,“m”)。正如你可以看到,当我计算mysql的每日差异时,我得到的两个记录的差异天数相同(209),但是,当通过pentaho水壶中的公式步骤计算月差异时,我会得到不同的结果(分别为7和6)。我不明白这是如何计算的......

任何人都可以在pentaho中生成'DATEDIF月'功能的源代码吗?我想在R中重现它,所以我得到完全相同的结果。

提前致谢, 最好的问候,

1 个答案:

答案 0 :(得分:2)

不确定mysql,但我认为它是一样的。在PostgreSQL中,日期差异给出整数值(以天为单位)。这意味着两行的总天数匹配。

计算月差非平凡。什么是月(28,30,31天)?如果月份不满,我们算一算吗?

文档说明如果日期之间没有完整的月份,则会返回0

但根据源代码易于理解如何计算日期:

源代码可通过github https://github.com/pentaho/pentaho-reporting/blob/f7defbcfc0e8f48ad2b139fe9820445f052e0e78/libraries/libformula/src/main/java/org/pentaho/reporting/libraries/formula/function/datetime/DateDifFunction.java

获得
private int addFieldLoop( final GregorianCalendar c, final GregorianCalendar target, final int field ) {
c.set( Calendar.MILLISECOND, 0 );
c.set( Calendar.SECOND, 0 );
c.set( Calendar.MINUTE, 0 );
c.set( Calendar.HOUR_OF_DAY, 0 );

target.set( Calendar.MILLISECOND, 0 );
target.set( Calendar.SECOND, 0 );
target.set( Calendar.MINUTE, 0 );
target.set( Calendar.HOUR_OF_DAY, 0 );

if ( c.getTimeInMillis() == target.getTimeInMillis() ) {
  return 0;
}

int count = 0;
while ( true ) {
  c.add( field, 1 );
  if ( c.getTimeInMillis() > target.getTimeInMillis() ) {
    return count;
  }
  count += 1;
 }
}

将1个月添加到开始日期,直到它变得大于结束日期