日期时间的SSIS源格式隐式转换

时间:2017-02-04 01:00:14

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

有没有人知道一个图表,显示SSIS中不同数据类型支持哪些日期格式?例如,DT_DBTimestamp是否支持格式1-Jan。我试过看但找不到任何东西。

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

1 个答案:

答案 0 :(得分:3)

一般信息

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

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包。在这个dataflowtask中,我创建了一个脚本组件(作为源)和一个平面文件目的地。该脚本有一个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抛出异常,那么就意味着无法转换格式。