gpt4 book ai didi

Informatica BDM 中的 Java 转换。将日期范围记录拆分为多条记录,每月一条记录

转载 作者:行者123 更新时间:2023-12-02 09:09:10 25 4
gpt4 key购买 nike

我有一组日期列(整数和日期/时间格式),我想将每个记录中的日期范围划分为多个记录,每个月一个记录:

一条记录的示例如下:

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

我正在使用 Java 转换将记录拆分为 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转换中的代码(我是第一次使用这个转换)如下:

以下是我的导入:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;

我的“输入”选项卡中用于创建 n 条记录的代码如下:

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 完全陌生,我无法理解如何创建两个新的日期列,其中每个记录的每个月值:有人可以帮助我吗?这将是一个很大的帮助。

最佳答案

永远不要使用糟糕的DateCalendar类。仅使用现代的java.time类。自采用 JSR 310 以来,较旧的类已成为遗产。

解析

LocalDate ld = LocalDate.parse( "19970201" , DateTimeFormatter. BASIC_ISO_DATE ) ;

LocalDateTime ldt = LocalDateTime.parse( "1997-02-01 00:00:00.0".replace( " " , "T" ) ;

生成

String output = ld.format( DateTimeFormatter. BASIC_ISO_DATE ) ;

String output = ldt.toString().replace( "T" , " " ) ;

循环年月

要确定日期范围内的每个月份,请循环使用 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.
}

所有这些都已在 Stack Overflow 上多次介绍过。搜索以了解更多信息。

如果您的输出是制表符分隔的文本或 CSV 文本,请使用 Apache Commons CSV 等库来提供帮助。

关于Informatica BDM 中的 Java 转换。将日期范围记录拆分为多条记录,每月一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59545129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com