Obecné informace
Toto jsou výchozí formáty datových typů datetimes (při převodu z řetězce)
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]
Poznámka:DT_DATE a DT_DBTIMESTAMP mají stejnou metodu SET
A myslím, že převod řetězce na datum závisí také na informacích o vaší aktuální kultuře
Podrobnější informace naleznete zde
- Datové typy integračních služeb
- PŘEKLADY DATOVÝCH TYPŮ SSIS NA SERVER SQL
Experimenty:
Po přečtení vašeho komentáře jsem nenašel žádný článek související s vaší otázkou, takže jsem provedl následující experimenty:
Implicitní převod data a času SSIS
Vytvořil jsem balíček SSIS s Dataflowtask. v této úloze datového toku jsem vytvořil komponentu skriptu (jako zdroj) a cíl plochého souboru. Skript má jeden výstupní sloupec OutDate
typu DT_DbTimeStamp
Uvnitř skriptu jsem použil následující kód:
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
Nejprve procházím všechny informace o kultuře a získávám všechny související formáty data a času a prohledávám je. Pak se snažím převést datum dtDate
deklarován do formátovaného řetězce a přiřadit jej do sloupce Výstup.
Pokud je tedy akceptováno přiřazení hodnoty řetězce se zadaným formátem výstupnímu sloupci DT_DBTIMESTAMP, znamená to, že formát je implicitně převeden
Output0Buffer.OutDate = dtDate.ToString(strFormat)
A zde je odkaz na výsledný soubor:
- Result.txt
Implicitní převod data a času serveru SQL Server
Existují dva formáty řetězce datetime, které jsou správně interpretovány s libovolným nastavením jazyka.
yyyyMMdd
yyyy-MM-ddTHH:mm:ss (ISO8601)
Také můžete zopakovat stejný experiment, ale tentokrát vytvořením SqlCommand
a jeho provedení:
Dim sqlcmd as new SqlCommand("SELECT CONVERT(DATETIME,'" + dtdate.ToString(strFormat) + '")"
sqlCmd.ExecuteReader()
Tímto způsobem můžete, pokud sqlcmd vyvolá výjimku, znamená to, že formát nelze převést.