SSIS 将 m/dd/yyyy 转换为不一致的 yyyymmdd

SSIS Convert m/dd/yyyy to yyyymmdd with inconsistencies

我正在将许多文件加载到 SQL SERVER 数据库中。我有一个平面文件,其中日期列为 string[DT_STR]。 我的数据库中有两个 "date fields"。一个是varchar,一个是datetime.

转换 datetime 列没问题,我只是在必要时使用数据 Conversion/Derived 列。但是,这个 varchar 专栏给我带来了麻烦。此列的数据库值应采用 yyyymmdd 格式。但是,在这个单个文件上,日期格式发生了变化。

通常我会在这里做一个 SUBSTRING(...) 表达式,但困难在于这些日期的格式会改变。值的一些示例可以是

08/16/2017
8/16/2017
08/6/2017
08/06/2017
10/6/2017
10/06/2017

这使挑战变得更加困难。我尝试了 LEN([DATE]) == NUM_HERE ? do_THING : OTHER_CALC,但这种方法失败了,因为 10/6/2017 的长度与 8/06/2017 相同,这会给我错误的结果。有人对此有好的解决方法吗?

也许简单地转换成日期,然后再转换成最终格式。如果是 2012+,使用 try_convert() 来捕获任何虚假日期。

例子

Declare @YourTable Table ([SomeCol] varchar(50))
Insert Into @YourTable Values 
 ('08/16/2017')
,('8/16/2017')
,('08/6/2017')
,('08/06/2017')
,('10/6/2017')
,('10/06/2017')

Select * 
     ,Formatted = convert(varchar(8),convert(Date,SomeCol),112)
 from @YourTable

Returns

SomeCol     Formatted
08/16/2017  20170816
8/16/2017   20170816
08/6/2017   20170806
08/06/2017  20170806
10/6/2017   20171006
10/06/2017  20171006

Convert 将 varchar 数据转换为日期时间并将其转换为格式化字符串

SELECT CONVERT(varchar,(CONVERT(datetime, '8/6/2017')),112)