1

我正在使用 SSIS (SQL 2008) 从 AS400 中获取数据。日期值作为 7 位数字存储在 400 中。格式如下:“CYYMMDD” C 是“世纪数字”,其中 0 = 1900 和 1 = 2000。我一直在研究派生列和脚本组件。我对 SSIS 很陌生,所有需要的演员和不同的案例都让我成为一个沉闷的男孩。此外,我正在失去前导零。我不确定这是否是 b/c 它们是数字类型,如果我将它们转换为字符串,我会正确地看到它们。下面是我在使用 SSIS 从 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
4

5 回答 5

2

你应该可以使用这个表达式

(DT_DBDATE) ((DT_STR) (AS400 + 19000000))
于 2011-02-01T21:09:38.510 回答
1

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

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 的东西。然后你可以根据需要将其转换或将其切碎成日期部分。

于 2011-02-01T21:38:19.663 回答
1

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

1. ((DT_WSTR,8)(<<AS400>> + 19000000)) 
2. (DT_DBDATE)(SUBSTRING(DCDateString,1,4) + "-" + SUBSTRING(DCDateString,5,2) + "-" + SUBSTRING(DCDateString,7,2))
于 2011-02-02T21:23:27.620 回答
1
select substring(t1.datefield,4,2)|| '/' || substring(t1.datefield,6,2) || '/' || (cast(substring(t1.datefield,1,3) as integer) + 1900) as RegularDate from db.table1 t1
于 2011-06-20T13:30:12.693 回答
0

如果我没记错的话,世纪标记日期并没有回到 1900 年,而是与任意日期有关。您可能需要查看与 Y2K 日期相关的 AS400 红皮书。我从 1992 年到 2005 年在 AS400 上编程。休息年份是 1939 年和 2039 年。这些日期之前或之后的日期分别在世纪标记系统下失败。这是因为 IBM 决定任何大于 39 的两位数年份指代 1900 年代,小于或等于 39 的任何两位数指代 2000 年代。如果您正在处理未来的日期,这可能会导致障碍。

于 2018-01-13T12:28:29.580 回答