在包含导入包的Sql Server中导入date值

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

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

我想你在这里有两个问题。 一,右alignment的值被解释为date,但他们错了,因为Excel认为他们是m / d / yyyy,你想d / m / yyyy。 二,左alignment的值被解释为文本。

不幸的是,当数据已经存在时,将列应用于列不会改变底层存储。 由于Excel已经混淆了数据,您将需要自己parsing出正确的值。

以上每个问题都需要不同的解决scheme 这里是一个视觉展示如何打破问题和相应的修复:

在这里输入图像说明

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

这里是stream程和公式:

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

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

通过parsing数字在斜线中的位置并build立date值,D列对解释为文本的数据起作用。 你不需要这个,但我清楚地显示它:

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

列E对解释为date的数据进行处理,但是其中d和m相反。 再次,不需要,但显示清楚:

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

F列将D和E与IF结合在一起以应用适当的修正::

 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))) 
Interesting Posts