3

我必须导入的文件 (CSV) 中的日期字段格式DD-MMM-YY为 ,SQL Server 将它们导入为YY-MM-DD. 所以01-FEB-13导入为2001-02-13.

如何更改 SQL 用于导入日期的格式?

我无权访问原始 Oracle 数据库,只能访问从中导出的平面文件。所以我所做的几乎所有事情都必须在 SQL 中完成。

4

2 回答 2

4

更改 SQL Server 默认使用的日期格式需要修改 Windows 服务器文化设置。这不是一个好主意,特别是如果这是您遇到此问题的唯一文件。

我将使用脚本转换和 .NET Framework 的DateTime.ParseExact方法,它可以让您完全控制预期的格式。首先配置您用于读取 CSV 文件的平面文件连接管理器,以便将具有 DD-MMM-YY 日期的列DataType设置为stringorUnicode string而不是datedatabase date或任何其他特定于日期的类型: 在此处输入图像描述

在您的数据流中,在源组件和目标组件之间放置一个脚本转换,如下所示: 在此处输入图像描述

选择每个 DD-MMM-YY 日期列作为脚本转换的输入: 在此处输入图像描述

并创建一个与每个输入DataTypedate对应的输出列: 在此处输入图像描述

脚本转换代码将如下所示(使用 C#)

using System;
using System.Data;
using System.Globalization; // needed for CultureInfo.InvariantCulture
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public override void IncomingRows_ProcessInputRow(IncomingRowsBuffer Row)
    {
        string incomingFormat = "dd-MMM-yy";
        Row.ConvertedCreateDate = DateTime.ParseExact(
            Row.CreateDate, 
            incomingFormat, 
            CultureInfo.InvariantCulture);
        Row.ConvertedLastUpdateDate = DateTime.ParseExact(
            Row.LastUpdateDate, 
            incomingFormat, 
            CultureInfo.InvariantCulture);
    }
}
于 2013-02-26T18:50:16.857 回答
0

您可以使用 oracle 中的 to_char() 函数来格式化您的日期,以便它们采用您想要的格式。希望 Gordon 关于存储为文本的评论指的是临时表。出于各种原因,无论如何,您的第一次导入都应该是临时表。

于 2013-02-26T14:36:31.500 回答