0

我有一个包含以下流程的 SSIS 包。该包有两个数据流任务。

数据流任务 1:

在第一个数据流任务中,涉及不同数据库中多个表的存储过程的输出被写入数据库中的两个表。

数据流任务 2:

在第二个数据流任务中,将上述表之一的输出写入平面文件。

包中涉及的所有表都有一个BirthDate数据类型的列名VARCHAR(10)。此列包含格式为 YYYYMMDD 的字符串形式的日期值。

写入平面文件的数据以YYYY-MM-DD. 但是,我希望将日期值以格式写入平面文件MM-DD-YYYY

问题:

  1. 如何MM-DD-YYYY在平面文件中实现日期格式?

  2. 我是否需要将列数据类型从 VARCHAR(10) 更改为表中的其他数据类型?我在各种数据库中有很多表。

4

4 回答 4

1

.NET Framework 有一些非常好的字符串操作功能,脚本转换可以轻松解决这个问题。将脚本转换组件添加到您的数据流;在脚本转换编辑器的输入列部分中,确保包含BirthDate在可用输入列网格中并将其 UsageType 设置为ReadWrite. 然后,这段 C# 代码会将您的 YYYYMMDD 字符串转换为 MM-DD-YYYY:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    DateTime birthDate = DateTime.ParseExact(
        Row.BirthDate, 
        "yyyyMMdd",
        System.Globalization.CultureInfo.InvariantCulture);
    Row.BirthDate = birthDate.ToString("MM-dd-yyyy");
}

关于您的第二个问题:理想情况下,如果您将日期存储在数据库中,则应该使用适当的数据类型。您可能想在您的组织中询问为什么所有这些 BirthDate 列都被定义为VARCHAR- 当时可能有一个很好的理由。

于 2013-02-22T18:36:02.000 回答
1

对于类似的情况,我使用数据转换工具,无需更改源表数据类型。它有助于维护源表和目标表的完整性。

在此处输入图像描述

祝你好运

于 2013-02-22T03:35:32.873 回答
0

如果它总是YYYYMMDD- 也就是说,像20130221这样的零填充,我只会使用简单的字符串函数:

SUBSTRING([Birthdate],5,2) + '-' 
+ SUBSTRING([Birthdate],7,2) + '-' 
+ SUBSTRING([Birthdate],1,4)

我同意使用实际datetimedate数据类型会更好。但如果你不能或不会,那么像这样的简单表达对我来说似乎是最简单的方法。

于 2013-02-22T02:39:52.863 回答
0

Here's one solution. Optimally, you should alter the column to the correct data type:

SELECT CONVERT(VARCHAR, CONVERT(DATETIME, wrongtypecol, 120), 110) AS date 
FROM   tbl 

See the demo

于 2013-02-22T02:40:03.157 回答