如何在 SSIS 中将 Y2K 日期转换为 SQL 日期?
Posted
技术标签:
【中文标题】如何在 SSIS 中将 Y2K 日期转换为 SQL 日期?【英文标题】:How Do I Convert a Y2K Date to SQL DATE In SSIS? 【发布时间】:2011-02-01 20:53:21 【问题描述】:我正在使用 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
【问题讨论】:
必须做 2 个派生列。 1. ((DT_WSTR,8)(> + 19000000)) 2. (DT_DBDATE)(SUBSTRING(DCDateString,1,4) + "-" + SUBSTRING(DCDateString,5,2) + "-" + SUBSTRING(DCDateString,7,2)) 【参考方案1】:你应该可以使用这个表达式
(DT_DBDATE) ((DT_STR) (AS400 + 19000000))
【讨论】:
我对 = 19000000 部分感到惊讶。很简单。不过,演员表并没有像你写的那样工作。必须转换为 DT_WSTR,然后将日期部分与 '-' 组合在一起,以便转换为 dbdate 才能工作。谢谢,【参考方案2】:首先,在派生列任务中添加前导零:
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 的东西。然后你可以根据需要将其转换或将其切碎成日期部分。
【讨论】:
我使用了一些你的答案和 CK 的。两者都没有 100% 工作。只需将 19000000 添加到值的原始日期,然后转换。【参考方案3】:这两个答案都不是 100%,但都帮助我找出问题所在。不确定将谁标记为“正确”这是我所做的。必须做 2 个派生列。
1. ((DT_WSTR,8)(<<AS400>> + 19000000))
2. (DT_DBDATE)(SUBSTRING(DCDateString,1,4) + "-" + SUBSTRING(DCDateString,5,2) + "-" + SUBSTRING(DCDateString,7,2))
【讨论】:
【参考方案4】: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
【讨论】:
【参考方案5】:如果我没记错的话,世纪标记日期并没有回到 1900 年,而是与任意日期有关。您可能需要查看与 Y2K 日期相关的 AS400 红皮书。我从 1992 年到 2005 年在 AS400 上编程。休息年份是 1939 年和 2039 年。这些日期之前或之后的日期分别在世纪标记系统下失败。这是因为 IBM 决定任何大于 39 的两位数年份指代 1900 年代,小于或等于 39 的任何两位数指代 2000 年代。如果您正在处理未来的日期,这可能会导致障碍。
【讨论】:
以上是关于如何在 SSIS 中将 Y2K 日期转换为 SQL 日期?的主要内容,如果未能解决你的问题,请参考以下文章
在表达式生成器 SSIS 2019 中将日期时间转换为字符串