Informatica BDM中的Java转换。将日期范围记录拆分为多个记录,每个月一个记录
我有一组Int和date/Time格式的日期列,我想将每个记录中的日期范围划分为多个记录,每个月一个记录: 一条记录的示例如下所示:Informatica BDM中的Java转换。将日期范围记录拆分为多个记录,每个月一个记录,java,informatica,Java,Informatica,我有一组Int和date/Time格式的日期列,我想将每个记录中的日期范围划分为多个记录,每个月一个记录: 一条记录的示例如下所示: ID St_Dt_Int St_Dt_Date End_Dt_Int End_Dt_Date 1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 for (int i=0; i<=
ID St_Dt_Int St_Dt_Date End_Dt_Int End_Dt_Date
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0
for (int i=0; i<=n_months; i++)
{
if (i == 24)
{
break;
}
o_ID = Id;
o_St_Dt_Int = St_Dt_Int;
o_St_Dt_Date = St_Dt_Date;
o_End_Dt_Int = End_Dt_Int;
o_End_Dt_Date = End_Dt_Date;
o_n_months = n_months;
o_month_number = i;
Date date = new Date(St_Dt_Date);
java.util.Calendar cal = Calendar.getInstance();
cal.setTime(date);
o_YYYY = cal.get(Calendar.YEAR);
ext_MM = cal.get(Calendar.MONTH) + 1;
ext_DD = cal.get(Calendar.DAY_OF_MONTH);
if (ext_MM < 10) {
o_MM = "0"+String.valueOf(ext_MM);
}
else {
o_MM = String.valueOf(ext_MM);
}
if (ext_DD < 10) {
o_DD = "0"+String.valueOf(ext_DD);
}
else {
o_DD = String.valueOf(ext_DD);
}
generateRow();
}
我使用Java transofmration将记录拆分为n 13个记录,持续n 13个月。但我无法创建两个新的日期列,每个记录的每个月值为:
ID St_Dt_Int St_Dt_Date End_Dt_Int End_Dt_Date month_number n_months YYYY MM DD ext_MM ext_DD
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 0 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 1 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 2 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 3 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 4 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 5 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 6 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 7 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 8 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 9 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 10 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 11 12 1996 02 01 2 1
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 12 12 1996 02 01 2 1
我正在使用Informatica BDM。我知道使用Informatica函数(如GET_DATE_PART和ADD_TO_DATE等)进行此操作要容易得多,我确实做到了。但有一个问题是,当我的代码在下压过程中转换为Spark代码时会发生。因此,我希望在Java转换中实现这两个每月一列,同时将每个记录拆分为n个记录
我的预期输出如下所示,其中两个新列根据日期范围包含每条记录的月份值:
ID St_Dt_Int St_Dt_Date End_Dt_Int End_Dt_Date month_number n_months YYYY MM DD ext_MM ext_DD Required_St_Date Required_End_Date
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 0 12 1996 02 01 2 1 19960201 19960229
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 1 12 1996 02 01 2 1 19960301 19960331
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 2 12 1996 02 01 2 1 19960401 19960430
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 3 12 1996 02 01 2 1 19960501 19960531
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 4 12 1996 02 01 2 1 19960601 19960630
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 5 12 1996 02 01 2 1 19960701 19960731
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 6 12 1996 02 01 2 1 19960801 19960831
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 7 12 1996 02 01 2 1 19960901 19960930
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 8 12 1996 02 01 2 1 19961001 19961031
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 9 12 1996 02 01 2 1 19961101 19961130
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 10 12 1996 02 01 2 1 19961201 19961231
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 11 12 1996 02 01 2 1 19970101 19970131
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0 12 12 1996 02 01 2 1 19970201 19970229
我第一次使用此转换的Java转换中的当前代码如下:
ID St_Dt_Int St_Dt_Date End_Dt_Int End_Dt_Date
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0
for (int i=0; i<=n_months; i++)
{
if (i == 24)
{
break;
}
o_ID = Id;
o_St_Dt_Int = St_Dt_Int;
o_St_Dt_Date = St_Dt_Date;
o_End_Dt_Int = End_Dt_Int;
o_End_Dt_Date = End_Dt_Date;
o_n_months = n_months;
o_month_number = i;
Date date = new Date(St_Dt_Date);
java.util.Calendar cal = Calendar.getInstance();
cal.setTime(date);
o_YYYY = cal.get(Calendar.YEAR);
ext_MM = cal.get(Calendar.MONTH) + 1;
ext_DD = cal.get(Calendar.DAY_OF_MONTH);
if (ext_MM < 10) {
o_MM = "0"+String.valueOf(ext_MM);
}
else {
o_MM = String.valueOf(ext_MM);
}
if (ext_DD < 10) {
o_DD = "0"+String.valueOf(ext_DD);
}
else {
o_DD = String.valueOf(ext_DD);
}
generateRow();
}
以下是我的作品:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
“我的输入”选项卡中创建n条记录的代码如下:
ID St_Dt_Int St_Dt_Date End_Dt_Int End_Dt_Date
1234 19960201 1996-02-01 00:00:00.0 19970201 1997-02-01 00:00:00.0
for (int i=0; i<=n_months; i++)
{
if (i == 24)
{
break;
}
o_ID = Id;
o_St_Dt_Int = St_Dt_Int;
o_St_Dt_Date = St_Dt_Date;
o_End_Dt_Int = End_Dt_Int;
o_End_Dt_Date = End_Dt_Date;
o_n_months = n_months;
o_month_number = i;
Date date = new Date(St_Dt_Date);
java.util.Calendar cal = Calendar.getInstance();
cal.setTime(date);
o_YYYY = cal.get(Calendar.YEAR);
ext_MM = cal.get(Calendar.MONTH) + 1;
ext_DD = cal.get(Calendar.DAY_OF_MONTH);
if (ext_MM < 10) {
o_MM = "0"+String.valueOf(ext_MM);
}
else {
o_MM = String.valueOf(ext_MM);
}
if (ext_DD < 10) {
o_DD = "0"+String.valueOf(ext_DD);
}
else {
o_DD = String.valueOf(ext_DD);
}
generateRow();
}
我对Java完全陌生,我无法理解如何用每个记录的每个月值创建两个新的日期列:有人能帮我吗?这将是一个很大的帮助。永远不要使用糟糕的日期和日历类。仅使用现代java.time类。随着JSR310的采用,较旧的类成为遗留类
解析
生成
循环年/月
要确定日期范围中的每个月,请循环YearMonth对象
YearMonth yearMonthStart = YearMonth.from( localDateStart ) ;
…
YearMonth ym = yearMonthStart ;
while ( ! ym.isAfter( yearMonthStop ) ) {
LocalDate ld = ym.atDay( 1 ) ;
LocalDateTime ldt = ld.atStartOfDay() ;
… generate your String output as shown above.
ym = ym.plusMonths( 1 ) ; // Prepare for the next loop.
}
所有这些都已经在堆栈溢出上讨论过很多次了。搜索以了解更多信息
如果输出是以制表符分隔的文本或CSV文本,请使用ApacheCommons CSV之类的库提供帮助