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

时间:2012-04-20 09:25:29

标签: ssis

我有一个输入文本文件,其中包含几列TransactionIDreceiveddtdescription等。recieveddt列的日期值采用以下格式< strong> 120419 (yymmdd) 。我想将.txt输入文件加载到数据库中,但目标列recieveddt的数据类型为DateTime。我使用派生列转换将传入的receivedt列值转换为datetime,如下所示

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

我尝试了不同的组合,但在尝试执行类型转换时我一直遇到错误。

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

2 个答案:

答案 0 :(得分: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源派生列转换和两个多播转换配置数据流任务。

Data Flow Task

使用以下格式为 YYMMDD 的值的查询配置 OLE DB源

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

配置派生列转换,将 YYMMDD 格式的 ReceivedDt 列中的传入值转换为 ReceivedDate < / em>格式为 YYYYMMDD

Derived Column Transformation

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

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

Success Multicast Transformation

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

Error Multicast Transformation

答案 1 :(得分:3)

试试这个:

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

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

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