3

我有一个 CSV 文件,其日期列采用以下格式mm/dd/yyyy (4/20/2012),我需要将此列加载到日期时间列在yyyy-mm-dd (2012-04- 20)。

我为此目的使用了派生列转换,并像这样写和表达

(DT_WSTR)(SUBSTRING(ReceivedDateTime,1,4) + "-" + 
SUBSTRING(ReceivedDateTime,5,2) + "-" + SUBSTRING(ReceivedDateTime,7,2)) 

运行我的包后,它会抛出错误Unable to perform type cast

4

3 回答 3

5

如果来自 CSV 文件的传入值始终采用04/20/2012( MM/DD/YYYY) 格式,那么您不必执行任何类型转换。您只需配置平面文件连接管理器以将文件中的值视为date数据类型。

假设您的 CSV 文件看起来像这样,其中有一列包含 .

CSV 文件

在 SSIS 包中,创建一个平面文件连接管理器来读取 CSV 文件。我将 CSV 存储在路径中C:\temp\Source.csv

平面文件源通用部分

在该Advanced部分中,您会注意到平面文件连接管理器将第一列命名为Column1,并且 DataType 属性设置为string [DT_STR]。但是,文件中的值实际上是日期。您可以手动配置数据类型或单击Suggest Types...按钮。

高级建议类型

Suggest Column Types上,保留默认值并单击OK。这将读取文件的前 100 行,并根据文件中可用的数据确定列类型。

建议列类型

单击OK建议列类型”对话框后,您会注意到平面文件连接管理器上的数据类型Column 0已更改为date [DT_Date]. 单击确定以配置平面文件连接管理器。您还可以根据您的要求重命名该列(例如InvoiceDateOrderDate等)

数据类型已更改

现在您已经配置了平面文件连接管理器,您可以在数据流任务的平面文件源中使用它来读取数据并填充您的数据库。因此,无需使用派生列转换来操作值。

但是,如果您传入的文件值是类似的字符串120420 (YYMMDD),则这些值不能配置为日期数据类型。在这些情况下,您需要按照此答案中的建议使用派生列转换。

希望有帮助。

于 2012-04-21T15:57:15.783 回答
1

如果您的传入值是一个字符串20140106(YYYYMMDD),那么使用 () 对语句进行类型转换DDT_DBDATE将引发错误。我遇到了这个问题,所以我取出了类型转换,映射看起来像这样:

(LEN(TRIM(SUBSTRING([Screening Date],1,8))) > 0 ? (SUBSTRING([Screening Date],1,4) + "/" + SUBSTRING([Screening Date],5,2) + "/" + SUBSTRING([Screening Date],7,2)) : NULL(DT_WSTR,5))

后来我添加了一个数据转换转换并将其更改为数据库时间戳,它对我有用。您也可以将其更改为键入 date( DT_DATE)。

谢谢!

于 2014-06-20T22:18:18.910 回答
0

尝试以下,(我成功地做到了)

(LEN(TRIM(SUBSTRING(ReceivedDateTime,1,8))) > 0 ? (DT_DBDATE)(SUBSTRING(ReceivedDateTime,1,4) + "-" + SUBSTRING(ReceivedDateTime,5,2) + "-" + SUBSTRING(ReceivedDateTime,7,2)) : (DT_DBDATE)NULL(DT_WSTR,5))

只需使用 (DT_DBDATE) 对语句进行类型转换。如果该位置没有日期,即如果接收到的字符串的位置 1 到 8 为空,那么它也会设置为 NULL。

于 2012-04-23T09:13:11.570 回答