从数字字段到日期的 SSIS 转换失败

SSIS Conversion Failure From Numeric Field to Date

我在 AS400 table 中有一个字段,它是一个数字(十进制 8)字段。在此,日期以 YYYYMMDD 格式存储,例如 20180518.

然后我在 MS SQL 服务器中有一个阶段 table,我在处理之前将此数据转储到该阶段。目标列的类型为日期。

我无法让 SSIS 包相应地传递值。我们尝试做的是将数字字段拆分为一个字符串,然后获取子字符串。然后将这些部分连接到 assemble 一个 MM/DD/YYYY 格式的字符串。

substring(myfield,5,2) || '-' || substring(myfield,7,2) || '-' || substring(myfield,1,4)

我们还尝试在 AS400 上使用 Date() 函数..

Date(substring(myfield,1,4) || '-' || substring(myfield,5,2) || '-' || substring(myfield,7,2))

在这些选项都不起作用的情况下,我尝试使用 SSIS 转换工具来执行任务。我将我的查询改回只是拉入该字段,然后将其传递给数据转换工具。在该工具中,它首先将该列视为小数。

[Input Column][Output Alias][Data Type]
[myfield     ][AliasMyField][decimal[DT_DECIMAL]]

然后我将其更改为

[Input Column][Output Alias][Data Type]
[myfield     ][AliasMyField][date[DT_DATE]]

似乎无论我们尝试哪种方式,包都不会执行,而且我不断得到:

Conversion failed because the data value overflowed the specified type.

您不需要抓取任何子字符串。如果您将 YYYYMMDD 格式的字符串插入 SQL 服务器日期时间字段,无论您的区域设置如何,它都将毫无问题地插入。

编辑:解决此问题的明确方法是让您的数据流将数据导入暂存 table,该暂存将 8 位日期接收到 varchar 字段中,无需任何修改。

然后使用 TRY_CONVERT() 将数据移动到最终 table 以将 varchar 转换为日期时间,如果无法转换特定值,则为 NULL。

可能有无效日期 "numbers"、20180229、20171305、00000000 或 99999999...

或者它可能是 i 的有效日期,但不是 SQL 服务器,例如 00010101 或 99991231(除非您使用较新的日期或 datetime2 类型)

您需要一个函数来执行转换并捕获转换错误替换有效日期或 returns NULL 如果可以接受。

当 NULL 不可接受时,我通常会做类似的事情

< 00010101 ==> 00010101  
> 99991231 ==> 99991231  
= xxxx0229 ==> xxxx0228

这些都是简单的...任何其他你必须自己决定