【问题标题】:Java Transformation in Informatica BDM. Split a date range record into multiple records with one record per monthInformatica BDM 中的 Java 转换。将日期范围记录拆分为多条记录,每月一条记录
【发布时间】:2023-03-24 13:09:01
【问题描述】:

我有一组日期列(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   

我正在使用 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;

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

【问题讨论】:

    标签: java informatica


    【解决方案1】:

    永远不要使用糟糕的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 对象。

    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 之类的库来提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      相关资源
      最近更新 更多