Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Informatica BDM中的Java转换。将日期范围记录拆分为多个记录,每个月一个记录_Java_Informatica - Fatal编程技术网

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

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<=

我有一组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<=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之类的库提供帮助