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 不一致的主要内容,如果未能解决你的问题,请参考以下文章