SSIS错误导入Excel日期(截断错误)

时间:2017-03-07 17:02:24

标签: sql-server excel datetime ssis etl

我很遗憾发布一个看似非常简单的问题,但我找不到答案,而且我在浪费时间(此时不仅仅是几个小时)。我是SSIS的新手,它只是踢我的背后。

背景

非常简单的SSIS包,用于将Excel工作表导入SQL Server中的Staging表。由于我不想通过使用错误的命名法误导任何人,我将Excel源代码称为Excel,将SQL Server表称为目标表。

这个包以前有过工作。但是,由于日期列的数据截断,它现在失败了。 Excel列已格式化为DATE(我在DATE中尝试了一些不同的格式选项)。目标列也是DATE列(非日期时间)。 Excel中的数据主要是空单元格,具有一些零星值。我认为错误在日期开始出现在数据中时开始(而不仅仅是空白)。

我尝试过双面使用高级编辑器(Excel& Target)并尝试了大量的数据类型设置,但我仍然遇到同样的失败。我怀疑它现在已经搞砸了我所做的各种测试。

我还尝试为日期字段“date [DT_DATE]”添加数据转换变换 - 这不起作用。 AND,我尝试创建派生列 - 首先基于Excel列,然后是转换列。所有这些尝试都失败了。

问题:

1)将Excel数据导入SQL Server for DATE列的最佳做法是什么?

2)由于这是两个非常成熟的Microsoft Apps(Excel和SQL Server)协同工作,看起来应该很简单。这让我相信我必须在这里遗漏一些基本概念。谁能让我直截了当?

3)你们如何在SQL Server中获得Excel日期?

4)进行编辑后同步列的技巧是什么?

感谢您提供的任何见解。很抱歉打扰你们看起来非常简单。

大卫

2 个答案:

答案 0 :(得分:1)

就我个人而言,我认为excel约会没有最佳实践,这对我来说总是很痛苦。

如果您可以格式化Excel文件,请尝试将其更改为'文字'。它将导入为Unicode而不是日期。如果没有,请尝试转换"数据转换中的列 "任务到Unicode

完成后,您需要使用"派生列"任务。以您想要的格式构建日期。

来源MM/dd/yyyy hh:mm:ss

的示例

构建为yyyy-MM-dd

SUBSTRING(datecolumn,7,4)+ "-" + SUBSTRING(datecolumn,1,2)+ "-" +SUBSTRING(datecolumn,4,2)

可能是粗暴的,但可以节省我的理智。

如果日期看起来像m/d/yyyy时不包括Jan或者其他内容的2个值,那么您将为月份部分添加一些类似的内容。

RIGHT("0" + SUBSTRING(datecolumn,1,FINDSTRING(datecolumn,"/"1)-1),2)
祝你好运

答案 1 :(得分:1)

从excel工作表导入数据时的主要问题是excel是excel中的每一列都可以有多种数据类型或格式,因此同一列可以包含日期和数字以及带有不同格式的文本或日期(某些格式不能是隐式转换为SSIS中的日期。)

如果所有日期值都存储为日期(而不是文本),则从Excel工作表中导入日期的最佳做法是将DATE转换为数字格式"0.000000000" (在excel中,它是从excel调用 Serial DateTime 或使用像Microsoft.Office.Interop.Excel

这样的库以编程方式调用

您可以参考此Link,但请使用以下内容:

xlCells.NumberFormat = "0.0000000"

然后在SSIS包中使用脚本组件使用DateTime.FromOADate()函数

将其再次转换为Date

*假设inColumn是具有数字类型的Date列,请添加类型为outColumnDT_DBTIMESTAMP的输出列DT_DATE,并使用以下代码:

If Not Row.inColumn_IsNull Then

    Row.OutColumn = DateTime.FromOADate(CDbl(Row.inColumn))

Else 

    Row.OutColumn_IsNull = True

End If

注意:将列转换为数字格式时,您忽略了所有格式但仍具有日期值