基本信息
这些是日期时间数据类型的默认格式(从字符串转换时)
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具有相同的设置方法 https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.pipeline.pipelinebuffer.setdatetime.aspx
我认为将字符串转换为日期还取决于您当前的文化信息
更详细的信息可以在这里找到
- 集成服务数据类型 https://learn.microsoft.com/en-us/sql/integration-services/data-flow/integration-services-data-types?view=sql-server-2017
- SSIS 到 SQL Server 数据类型转换 https://devinknightsql.com/2010/12/22/ssis-to-sql-server-data-type-translations/
实验:
阅读您的评论后,我没有找到任何与您的问题相关的文章,所以我做了以下实验:
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)
这是结果文件的链接:
- 结果.txt https://www.dropbox.com/s/0f1kmbzgh78fkxw/Result.txt?dl=0
SQL Server 日期时间隐式转换
有两种日期时间字符串格式可以在任何语言设置下正确解释。
yyyyMMdd
yyyy-MM-ddTHH:mm:ss (ISO8601)
另外,您可以重复相同的实验,但这一次通过创建一个SqlCommand
并执行它:
Dim sqlcmd as new SqlCommand("SELECT CONVERT(DATETIME,'" + dtdate.ToString(strFormat) + '")"
sqlCmd.ExecuteReader()
这样,如果 sqlcmd 抛出异常,则意味着格式无法转换。