如何在SSIS中将Y2K日期转换为SQL日期?

如何在SSIS中将Y2K日期转换为SQL日期?,sql,ssis,ibm-midrange,y2k,Sql,Ssis,Ibm Midrange,Y2k,我正在使用SSIS(SQL 2008)从AS400带来数据。日期值以7位数字形式存储在400中。下面是格式:“CYYMMDD”C是一个“世纪数字”,其中0=1900,1=2000。我一直在研究派生列和脚本组件。我对SSIS是个新手,所有的演员都需要加上不同的案例,这让我变成了一个迟钝的孩子。而且,我正在丢失前导零。我不确定这是否是b/c,它们是数字类型,如果我转换为字符串或不转换为字符串,我会正确地看到它们。下面是我在使用SSI直接从400拉取SQL后看到的内容 AS400 = Actu

我正在使用SSIS(SQL 2008)从AS400带来数据。日期值以7位数字形式存储在400中。下面是格式:“CYYMMDD”C是一个“世纪数字”,其中0=1900,1=2000。我一直在研究派生列和脚本组件。我对SSIS是个新手,所有的演员都需要加上不同的案例,这让我变成了一个迟钝的孩子。而且,我正在丢失前导零。我不确定这是否是b/c,它们是数字类型,如果我转换为字符串或不转换为字符串,我会正确地看到它们。下面是我在使用SSI直接从400拉取SQL后看到的内容

AS400   =   Actual 
101         01/01/1900 (I think these are "unknown" dates)
1231        12/31/1900 (I think these are "unknown" dates)
20702       07/02/1902
151231      12/31/1915
1000102     01/02/2000
1110201     02/01/2011

您应该能够使用此表达式

(DT_DBDATE) ((DT_STR) (AS400 + 19000000))

您应该能够使用此表达式

(DT_DBDATE) ((DT_STR) (AS400 + 19000000))

首先,在派生列任务中添加前导零:

RIGHT("000000000" + (DT_STR,10,1252)AS400,7)
将其传递给另一个派生列任务,并使用表达式根据世纪数字执行转换,如:

SUBSTRING([Derived Column 2],1,1) == "0" ? (DT_UI4)[Derived Column 2] + 19000000 : (DT_UI4)SUBSTRING([Derived Column 2],2,8) + 20000000

这会给你一些类似20110201的信息。然后,您可以将其转换,或根据需要将其拆分为日期部分。

首先,在派生列任务中添加前导零:

RIGHT("000000000" + (DT_STR,10,1252)AS400,7)
将其传递给另一个派生列任务,并使用表达式根据世纪数字执行转换,如:

SUBSTRING([Derived Column 2],1,1) == "0" ? (DT_UI4)[Derived Column 2] + 19000000 : (DT_UI4)SUBSTRING([Derived Column 2],2,8) + 20000000

这会给你一些类似20110201的信息。然后,您可以将其转换,或根据需要将其分解为日期部分。

这两个答案都不是100%,但都帮助我解决了问题。我不确定在这里给谁打上“正确”的标记。必须做2个派生列

1. ((DT_WSTR,8)(<<AS400>> + 19000000)) 
2. (DT_DBDATE)(SUBSTRING(DCDateString,1,4) + "-" + SUBSTRING(DCDateString,5,2) + "-" + SUBSTRING(DCDateString,7,2))
1。((DT_WSTR,8)(+19000000))
2.(DT_DBDATE)(子字符串(DCDateString,1,4)+“-”+子字符串(DCDateString,5,2)+“-”+子字符串(DCDateString,7,2))

这两个答案都不是100%,但都帮助我找出了问题所在。我不确定在这里给谁打上“正确”的标记。必须做2个派生列

1. ((DT_WSTR,8)(<<AS400>> + 19000000)) 
2. (DT_DBDATE)(SUBSTRING(DCDateString,1,4) + "-" + SUBSTRING(DCDateString,5,2) + "-" + SUBSTRING(DCDateString,7,2))
1。((DT_WSTR,8)(+19000000))
2.(DT_DBDATE)(子字符串(DCDateString,1,4)+“-”+子字符串(DCDateString,5,2)+“-”+子字符串(DCDateString,7,2))

如果我没记错的话,世纪标记日期并不是追溯到1900年,而是与任意日期有关。您可能想查看与Y2K日期相关的AS400红皮书。我从1992年到2005年在AS400上编程。休息时间为1939年和2039年。日期之前或之后分别不符合世纪标记制度。这是因为IBM决定,任何大于39的两位数年份都指1900年代,任何小于或等于39的年份都指2000年代。如果你处理的是未来的日期,这可能会造成一个障碍。

如果我没记错的话,世纪标记的日期不是追溯到1900年,而是一个任意的日期。您可能想查看与Y2K日期相关的AS400红皮书。我从1992年到2005年在AS400上编程。休息时间为1939年和2039年。日期之前或之后分别不符合世纪标记制度。这是因为IBM决定,任何大于39的两位数年份都指1900年代,任何小于或等于39的年份都指2000年代。如果您处理的是未来的日期,这可能会造成障碍。

我对=19000000部分感到惊讶。这么简单。但是演员阵容并不像你写的那样有效。必须将日期转换为DT_WSTR,然后将日期部分与“-”组合在一起,以便转换为dbdate才能工作。谢谢,我对=19000000部分感到惊讶。这么简单。但是演员阵容并不像你写的那样有效。必须将日期转换为DT_WSTR,然后将日期部分与“-”组合在一起,以便转换为dbdate才能工作。谢谢,我必须做两个派生列。1.(8)(19000000)2。(DT_DBDATE)(子字符串(DCDateString,1,4)+“-”+子字符串(DCDateString,5,2)+“-”+子字符串(DCDateString,7,2))必须执行两个派生列。1.(8)(19000000)2。我用了一些你和CK的答案。两者都没有100%奏效。只需将19000000添加到原始日期,然后进行转换。我使用了一些您的答案和CK。两者都没有100%奏效。只需将19000000添加到值的原始日期,然后进行转换。