【问题标题】:How can I convert string (YYMMDD) to datetime using derived column transformation?如何使用派生列转换将字符串 (YYMMDD) 转换为日期时间?
【发布时间】:2012-04-20 09:25:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我可以知道为什么不使用 dataConversion 转换吗?

标签: ssis


【解决方案1】:

表达式:

(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列中的传入值以YYMMDD格式转换为ReceivedDate 格式 YYYYMMDD.

在派生列转换和多播转换之间附加数据查看器。将错误输出配置为 Redirect row 而不是 Fail 组件

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

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

【讨论】:

    【解决方案2】:

    试试这个:

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

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

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

    【讨论】:

    • 感谢 Jeroen 的反馈,它帮助了我。
    猜你喜欢
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    相关资源
    最近更新 更多