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

Posted

技术标签:

【中文标题】SSIS 将 m/dd/yyyy 转换为 yyyymmdd 不一致【英文标题】:SSIS Convert m/dd/yyyy to yyyymmdd with inconsistencies 【发布时间】:2017-06-30 17:20:27 【问题描述】:

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

转换datetime 列没有问题,我只是在必要时使用数据转换/派生列。但是,这个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 相同,这会给我错误的结果。有没有人对此有很好的解决方法?

【问题讨论】:

您应该能够使用SELECT CAST('08/16/2017' AS datetime)将所有这些示例直接转换为日期时间 【参考方案1】:

也许可以简单地转换为日期,然后转换为最终格式。如果是 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

退货

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

【讨论】:

啊啊啊..我没想到这样!好想法。我会在 SSIS 内部还是外部执行此操作? @MattR 非此即彼……如果是我,我会在 SSIS 中将其作为派生列进行。 我是 SSIS 新手,如何将其翻译成表达式?如果你不喜欢“做我的功课”,那是可以理解的…… @MattR 没有看到你的数据就有点难了。我经常做的一件事是将我的数据加载到临时表中,该“日期”字段的数据类型将是 varchar。将数据加载到暂存中后,我将运行任何所需的验证/格式化/转换例程。这样,如果源数据是伪造的或意外的,我的核心数据就不会受到污染。 谢谢!我会试试的【参考方案2】:

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

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

【讨论】:

以上是关于SSIS 将 m/dd/yyyy 转换为 yyyymmdd 不一致的主要内容,如果未能解决你的问题,请参考以下文章

SSIS:将纪元列转换为日期

将SQL进程转换为SSIS包

将 SSIS 包转换为 .NET 应用程序?

SSIS 任务数据流 - 将平面时间值 HHMMSS 转换为 MSSql Time(7) 字段

无法在 SSIS 表达式生成器中转换日期

使用SSIS包将csv列转换为表列的日期格式?