如何在 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 派生列中将字符串转换为日期

在表达式生成器 SSIS 2019 中将日期时间转换为字符串

在 SSIS 中将日期 DD.MM.YYYY hh:mm:ss 转换为 YYYY-MM-DD

在 SSIS 中将 ODBC DB2 源转换为平面文件错误

如何在 SQL 中将数字转换为日期时间

如何在ssis中将空白转换为null