我需要在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中重现它,所以我得到完全相同的结果。
提前致谢, 最好的问候,
答案 0 :(得分:2)
不确定mysql,但我认为它是一样的。在PostgreSQL中,日期差异给出整数值(以天为单位)。这意味着两行的总天数匹配。
计算月差非平凡。什么是月(28,30,31天)?如果月份不满,我们算一算吗?
文档说明如果日期之间没有完整的月份,则会返回0
但根据源代码易于理解如何计算日期:
获得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个月添加到开始日期,直到它变得大于结束日期