在写入平面文件时,如何更改存储为字符串值的日期格式?

时间:2013-02-22 02:06:19

标签: sql date ssis etl

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

数据流任务1:

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

数据流任务2:

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

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

写入平面文件的数据将以 YYYY-MM-DD 格式保存。但是,我希望以 MM-DD-YYYY

格式将日期值写入平面文件

问题:

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

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

4 个答案:

答案 0 :(得分:1)

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

enter image description here

最好的运气

答案 1 :(得分: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 - 当时可能有充分的理由。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

这是一个解决方案。最理想的是,您应该将列更改为正确的数据类型:

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

See the demo