我在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]]
似乎无论我们尝试哪个途径,包都不会执行,而且我一直得到:
转换失败,因为数据值溢出指定的类型。
答案 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
那些是容易的......任何其他你必须自己决定