【问题标题】:SSIS Source Format Implicit Conversion for Datetime日期时间的 SSIS 源格式隐式转换
【发布时间】:2017-02-04 01:00:14
【问题描述】:

有谁知道显示 SSIS 中不同数据类型支持哪些日期格式的图表?例如,DT_DBTimestamp 是否支持1-Jan 格式。我试着寻找,但什么也找不到。

我问的原因是我发现当我尝试执行Convert(datetime, '1-Jan') 时,它失败了,这是我所期望的。但是,当我将相同的值拉入 SSIS 到 DT_DBTimestamp 时,它会隐式将其标识为 1/1/2017,而不是将行重定向为数据类型转换错误。

【问题讨论】:

    标签: sql sql-server ssis etl ssis-2012


    【解决方案1】:

    一般信息

    这些是日期时间数据类型的默认格式(从字符串转换时)

    DT_DBDATE
    yyyy-mm-dd
    
    DT_FILETIME
    yyyy-mm-dd hh:mm:ss:fff
    
    DT_DBTIME
    hh:mm:ss
    
    DT_DBTIME2
    hh:mm:ss[.fffffff]
    
    DT_DBTIMESTAMP
    yyyy-mm-dd hh:mm:ss[.fff]
    
    DT_DBTIMESTAMP2
    yyyy-mm-dd hh:mm:ss[.fffffff]
    
    DT_DBTIMESTAMPOFFSET
    yyyy-mm-dd hh:mm:ss[.fffffff] [{+|-} hh:mm]
    

    注意:DT_DATE 和 DT_DBTIMESTAMP 具有相同的SET method

    我认为将字符串转换为日期还取决于您当前的文化信息

    在这里可以找到更多详细信息

    实验:

    阅读您的评论后,我没有找到任何与您的问题相关的文章,因此我进行了以下实验:

    SSIS 隐式日期时间转换

    我创建了一个带有 Dataflowtask 的 SSIS 包。在这个数据流任务中,我创建了一个脚本组件(作为源)和一个平面文件目标。该脚本有一个OutDate 类型的DT_DbTimeStamp 输出列在脚本中我使用了以下代码:

    Private dtDate As Date = #01/01/2016#
    
    Public Overrides Sub CreateNewOutputRows()
    
        Output0Buffer.AddRow()
    
    
        Using sw As New IO.StreamWriter("D:\Result.txt", False)
            sw.WriteLine("CultureInfo;Date;Format;Accepted")
            sw.Close()
        End Using
    
    
        For Each ci As System.Globalization.CultureInfo In System.Globalization.CultureInfo.GetCultures(Globalization.CultureTypes.AllCultures)
    
            For Each strFormat As String In ci.DateTimeFormat.GetAllDateTimePatterns
    
                Dim boolResult As Boolean = True
                Try
    
    
                    Output0Buffer.OutDate = dtDate.ToString(strFormat)
    
                    boolResult = True
    
                Catch ex As Exception
    
                    boolResult = False
    
    
    
                End Try
    
                Using sw As New IO.StreamWriter("D:\Result.txt", True)
                    sw.WriteLine(ci.Name & ";" & dtDate.ToString(strFormat) & ";" & strFormat & ";" & boolResult.ToString)
                    sw.Close()
                End Using
    
            Next
    
    
    
        Next
    
    
    
    End Sub
    

    首先,我正在遍历所有文化信息,我正在获取与之相关的所有日期时间格式并遍历它们。然后我尝试将声明的日期dtDate 转换为格式化字符串并将其分配给输出列。

    因此,如果将指定格式的字符串值分配给 DT_DBTIMESTAMP 输出列被接受,则意味着格式是隐式转换的

    Output0Buffer.OutDate = dtDate.ToString(strFormat)
    

    这是结果文件的链接:

    SQL Server 日期时间隐式转换

    有两种日期时间字符串格式可以用任何语言设置正确解释。

    yyyyMMdd
    yyyy-MM-ddTHH:mm:ss    (ISO8601)
    

    此外,您可以重复相同的实验,但这一次通过创建 SqlCommand 并执行它:

    Dim sqlcmd as new SqlCommand("SELECT CONVERT(DATETIME,'" + dtdate.ToString(strFormat) + '")"
    
    sqlCmd.ExecuteReader()
    

    这样可以,如果sqlcmd抛出异常则表示无法转换格式。

    【讨论】:

    • 感谢您的信息。我确实遇到了您列出的那些参考资料,但是我正在寻找将从字符串隐式转换为 DT_DBTIMESTAMP 的格式,而不是 SSIS 将输出的最终格式。如问题中所述,例如,“1-Jan”的 CONVERT to Datetime 为何会失败,但 SSIS 会隐式将其转换为 datetime 并将其输出为“2017-01-01 00:00:00”。
    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多