7

我有一个输入文本文件,它由几列组成,即TransactionIDreceiveddtdescription。该recieveddt列具有以下格式的日期值120419 (yymmdd)。我想将 .txt 输入文件加载到数据库中,但目标列recieveddt是数据类型DateTime。我使用派生列转换将传入的receiveddt列值转换为日期时间,如下所示

Derived Column Name  Derived Column     Expression            Data Type 
-------------------  -----------------  --------------------  ---------
receiveddate         replace reciveddt  (DT_DATE)[reciveddt]  datetime 

我尝试了不同的组合,但在尝试执行类型转换时不断出错。

如何使用派生列转换将字符串 (YYMMDD) 转换为日期时间?

4

2 回答 2

12

表达:

(DT_DATE)("20" + SUBSTRING([ReceivedDt], 1, 2) + "-" + SUBSTRING([ReceivedDt], 3, 2) + "-" + SUBSTRING([ReceivedDt], 5, 2))

为了可读性:

(DT_DATE)("20" + 
    SUBSTRING([ReceivedDt], 1, 2)  + "-" + 
    SUBSTRING([ReceivedDt], 3, 2)  + "-" +
    SUBSTRING([ReceivedDt], 5, 2))

问题原因:

您无法将格式中的字符串转换YYMMDD为有效的日期值。使用上面的表达式为值添加前缀以将值转换为可以转换为日期20的格式。YYYYMMDD

SSIS 2012 包说明了上述给定的表达式:

使用OLE DB 源派生列转换和两个多播转换配置数据流任务。

数据流任务

使用以下查询配置OLE DB 源,该查询具有YYMMDD格式的值。

SELECT  '120304' AS ReceivedDt UNION
SELECT  '120107' AS ReceivedDt UNION
SELECT  '121211' AS ReceivedDt UNION
SELECT  '121312' AS ReceivedDt;

配置派生列转换以将列ReceivedDt格式中的传入值转换YYMMDDReceivedDate格式YYYYMMDD

派生列转换

在派生列转换和多播转换之间附加数据查看器。将错误输出配置为重定向行而不是失败组件

执行包将在派生列转换和成功多播转换之间的数据查看器中显示可以转换为有效日期值的字符串值。

成功组播转型

执行包将在数据查看器中显示无法在派生列转换和错误多播转换之间转换的字符串值。

错误组播转换

于 2012-04-20T09:48:13.550 回答
3

试试这个:

(DT_DATE)("20" + SUBSTRING(receivedt,1,2) + "-" + SUBSTRING(receivedt,3,2) + "-" + SUBSTRING(receivedt,5,2))

请注意,此转换假定所有日期都在当前世纪。如果你有上个世纪的日期,你应该添加一个条件来检查它。

还为派生列转换定义错误路径以捕获格式错误的日期。例如,您可以给它们一个默认值。

于 2012-04-20T09:48:00.430 回答