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

标签 sql sql-server ssis etl ssis-2012

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

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

最佳答案

一般信息

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

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 包。在此数据流任务中,我创建了一个脚本组件(作为源)和一个平面文件目标。该脚本有一个类型为 DT_DbTimeStamp 的输出列 OutDate 在脚本内部我使用了以下代码:

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 抛出异常,则意味着格式无法转换。

关于sql - 日期时间的 SSIS 源格式隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035354/

相关文章:

SQL Server 更新触发器不工作

sql - MySQL - 我如何对连接的数据进行内部连接排序

mysql - 如何创建 SQL 存储过程以插入多个值

sql - 稍后在查询中使用 'AS ColumnName' 的值

excel - SSIS中的脚本任务导入Excel电子表格

sql - SSIS 和外键

c - FreeTDS:如何设置运行存储过程的参数字符集

java - 检查行是否已存在 如果不存在则插入行 否则显示消息

visual-studio-2015 - 新创建的 SSIS 包未显示在解决方案资源管理器中,能够在包位置看到 .dtsx 文件

c# - 如何将动态变化的字符串传递给脚本任务?