使用导入包在Sql Server中导入日期值

时间:2012-07-28 21:20:11

标签: sql sql-server excel visual-studio-2008

我在使用Sql Server中的Visual Studio导入数据时遇到了烦人的问题。我使用Visual Studio创建了一个SSIS导入包来导入Excel文件(.xlsx)。我导入的工作表有一个填充了日期类型值的列。有些值左对齐,有些值右对齐。如果我将整个列格式化为datetype,我仍然可以在该列上获得两种不同类型的对齐:例如4/1/2011右对齐,13/01/2011左对齐。 我使用nvarchar为该列导入文件,并为左对齐值获取NULL值。 如果我导入该列的datetime数据类型的文件,我会得到右对齐的NULL值。

我不关心信息如何在我的Sql数据库中“登陆”,无论是nvarchar还是datetime,但我需要完整的信息,没有NULLS。这似乎主要是一个Excel问题,因为Excel没有看到值具有相同的数据类型,因此不同的对齐类型。有什么建议吗?感谢任何建议/意见。谢谢。

1 个答案:

答案 0 :(得分:1)

我认为你有两个问题。一,右对齐值被解释为日期,但它们是错误的,因为Excel认为它们是m / d / yyyy而你想要d / m / yyyy。二,左对齐值被解释为文本。

不幸的是,当数据已存在时,将列格式应用于列不会更改底层存储。由于Excel已经使数据乱码,您需要自己解析正确的值。

上述每个问题都需要不同的解决方案。这是一个视觉展示我如何分解问题和相应的修复:

enter image description here

首先注意columns A, D, E, F中提到的日期格式。这解释了为什么4/1/2011的“固定”版本看起来与源相同。事实上,固定版本是1月4日,而来源是4月1日。

以下是流程和公式:

B栏和C栏是帮手。他们希望简化column D中的修复。这里的错误并不重要;在最后一步中它们将被忽略:

B3: =FIND("/",A3)
C3: =FIND("/",A3,B3+1)

列D通过解析数字在斜线中的位置并构建日期值来处理解释为文本的数据。你不需要这个,但为了清楚起见,我正在展示它:

D3: =DATE(RIGHT(A3,4),MID(A3,B3+1,C3-B3-1),LEFT(A3,B3-1))

E列适用于按日期解释的数据,但d和m相反。同样,不需要,但为了清晰起见:

E3: =DATE(YEAR(A3),DAY(A3),MONTH(A3))

列F将D和E与IF拉在一起以应用适当的fix ::

F3: =IF(ISERROR(VALUE(A3)),DATE(RIGHT(A3,4),MID(A3,B3+1,C3-B3-1),LEFT(A3,B3-1)),DATE(YEAR(A3),DAY(A3),MONTH(A3)))