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

时间:2018-05-18 18:42:02

标签: sql-server ssis db2-400

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

然后我在MS SQL Server中有一个阶段表,我在处理之前将这些数据转储。目标列的类型为Date。

我无法让SSIS包相应地传递值。我们尝试做的是将数字字段拆分为字符串,然后抓取子字符串。然后连接这些部分以组装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]]

似乎无论我们尝试哪个途径,包都不会执行,而且我一直得到:

  

转换失败,因为数据值溢出指定的类型。

2 个答案:

答案 0 :(得分:0)

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

编辑:解决此问题的一种明确方法是让您的数据流将数据导入到临时表中,该表将接收8位数日期转换为varchar字段而不进行任何修改。

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

答案 1 :(得分:0)

可能有无效日期"数字",20180229,20171305,00000000或99999999 ......

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

您需要一个执行转换的函数并捕获转换错误替换有效日期,或者如果可以接受则返回NULL。

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

的事情
< 00010101 ==> 00010101  
> 99991231 ==> 99991231  
= xxxx0229 ==> xxxx0228

那些是容易的......任何其他你必须自己决定