【问题标题】:Datetime convert error in SSISSSIS中的日期时间转换错误
【发布时间】:2016-06-20 08:47:19
【问题描述】:

我想以 YYYY.MM.DD hh:mm:ss.nnn (2015.09.28 00:00:02.721) 格式导入一个带有 datetime-column 的巨大 csv 文件。它是日期时间支持的字符串文字格式: datetime (Transact-SQL)。 我使用 DT_DBTIMESTAMP 作为集成服务数据类型: Integration Services Data Types。 但是由于转换错误,导入不起作用。我只能以 YYYY-MM-DD hh:mm:ss.nnn 格式导入。我的操作系统、SQL 2014 和 DB 都是德语的。如何在不使用正则表达式在 csv 中搜索和替换的情况下执行此任务?

【问题讨论】:

    标签: datetime ssis type-conversion


    【解决方案1】:

    我不确定我是否理解您对正则表达式的意思 - 但这里有一个适合您的解决方案:

    您可以将文件导入临时保存表,然后使用 DataConversion 任务将其转换为日期时间。

    您还可以将以下 SQL 应用于您的表 - 这可能会更快:

    UPDATE tempTable SET NewDateCol = CAST(OldDateCol AS DATETIME)
    

    其中OldDateCol 是包含“无效”日期格式的导入文本字段。

    因为我们知道这会奏效:

    SELECT CAST('2012.05.06 11:25:33.123' AS DATETIME)
    

    【讨论】:

    • 我必须使用正则表达式进行搜索和替换,因为点也是毫秒的分隔符,我不能使用快速替换,例如放屁(fart-it.sourceforge.net)。我们在这里谈论的是巨大的 csv 文件(超过 100M 行),我不敢相信,我需要对源文件或 SQL 进行额外的转换步骤才能实现正确的类型转换?
    • PS 非常感谢您的建议,CAST 工作正常。但是我在没有额外步骤的情况下搜索解决方案,使用 BULK INSERT 和格式化文件的 pehpaps - 它会工作吗?
    • 我认为您不需要“额外”步骤 - 在平面文件连接中导入输入列时,应将其设置为 DT_DBTIMESTAMP2。
    【解决方案2】:

    纯 SSIS 数据流解决方案 - 使用以下公式为 NewDateCol 导出列转换

    (DT_DBTIMESTAMP2)(REPLACE(SUBSTRING(OldDateCol,1,10),".","-")+SUBSTRING(OldDateCol, 11, LEN(OldDateCol)))   
    

    基本上,这个表达式替换了 .在前 10 个符号上加上 -,然后附加其余符号。

    【讨论】:

    • 为什么需要更换?
    • @BIDeveloper,要转换为 SSIS 日期时间的字符串必须采用 YYYY-HH-MM hh:mm:ss.nnn 格式。因此,在类型转换之前的句点应该替换为破折号。
    • 试试这个:SELECT CAST('2012.05.06 11:25:33.123' AS DATETIME) ...不需要REPLACE
    • @BIDeveloper,此字符替换的重点是完全消除您的答案中对临时保存表的需求。纯 SSIS 数据转换,无需额外的 SQL 往返。
    • @BIDeveloper,刚刚测试了您的设置 - 我的服务器具有俄罗斯语言环境,因此它预计日期时间为 YYYY/MM/DD .... 创建了包含两行数据的测试文件 - 例如 2016.01.02 00: 00:01.123,在平面文件源中将此字段描述为 DT_DBTIMESTAMP2。数据查看器显示错误“ttt 错误:年、月和日参数描述了无法表示的日期时间。”因此,当 SSIS 引擎无法自行将字符串解析为 DateTime 时,您必须将其与标准格式 YYYY-MM-DD .... 对齐
    【解决方案3】:

    我的解决方法: 1.使用日期时间创建表(它会产生毫秒舍入错误 - 2015.09.28 00:00:01.159 是 2015-09-28 00:00:01.160 等,无论出于何种原因)或 datetime2(3) (2015.09.28 00: 00:01.159 是 2015-09-28 00:00:01.1590000 - 正确但过大) 2. 设置日期格式 ymd 3. 使用 TABLOCK 和 CODEPAGE='RAW' 从 csv 批量插入以提高性能

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      相关资源
      最近更新 更多