Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Implizite Konvertierung des SSIS-Quellformats für Datetime

Allgemeine Informationen

Dies sind die Standardformate von datetimes-Datentypen (beim Konvertieren von Strings)

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]

Hinweis:DT_DATE und DT_DBTIMESTAMP haben dieselbe SET-Methode

Und ich denke, dass das Konvertieren von Strings bis heute auch von Ihren aktuellen Kulturinformationen abhängt

Genauere Informationen finden Sie hier

  • Integration Services-Datentypen
  • SSIS-TO-SQL-SERVER-DATENTYPÜBERSETZUNG

Experimente :

Nachdem ich Ihren Kommentar gelesen habe, habe ich keinen verwandten Artikel zu Ihrer Frage gefunden, also habe ich die folgenden Experimente durchgeführt:

Implizite SSIS-Datum/Uhrzeit-Konvertierung

Ich habe ein SSIS-Paket mit einer Dataflowtask erstellt. In dieser Dataflowtask habe ich eine Skriptkomponente (als Quelle) und ein Flatfileziel erstellt. Das Skript hat eine Ausgabespalte OutDate vom Typ DT_DbTimeStamp Innerhalb des Skripts habe ich den folgenden Code verwendet:

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

Zuerst schleife ich alle Kulturinformationen durch und erhalte alle damit verbundenen Datetime-Formate und schleife sie durch. Dann versuche ich, das Datum dtDate umzuwandeln als formatierte Zeichenfolge deklariert und der Ausgabespalte zugewiesen.

Wenn also die Zuweisung eines Zeichenfolgenwerts mit dem angegebenen Format zur Ausgabespalte DT_DBTIMESTAMP akzeptiert wird, bedeutet dies, dass das Format implizit konvertiert wird

Output0Buffer.OutDate = dtDate.ToString(strFormat)

Und hier ist der Link der Ergebnisdatei:

  • Ergebnis.txt

SQL Server datetime implizite Konvertierung

Es gibt zwei Datetime-String-Formate, die mit jeder Spracheinstellung richtig interpretiert werden.

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

Sie können dasselbe Experiment auch wiederholen, aber dieses Mal, indem Sie einen SqlCommand erstellen und ausführen:

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

sqlCmd.ExecuteReader()

Auf diese Weise können Sie, wenn sqlcmd eine Ausnahme auslöst, bedeutet, dass das Format nicht konvertiert werden kann.