sql >> Databasteknik >  >> RDS >> Sqlserver

SSIS källformat Implicit konvertering för datum och tid

Allmän information

Dessa är standardformaten för datetimes-datatyper (vid konvertering från sträng)

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]

Obs! DT_DATE och DT_DBTIMESTAMP har samma SET-metod

Och jag tror att konvertering av sträng till datum också beror på din nuvarande kulturinformation

Mer detaljerad information finns här

  • Datatyper för integrationstjänster
  • ÖVERSÄTTNINGAR TILL SSIS TILL SQL SERVER DATATYP

Experiment :

Efter att ha läst din kommentar hittade jag ingen relaterad artikel till din fråga så jag gjorde följande experiment:

SSIS implicit datetime-konvertering

Jag skapade ett SSIS-paket med en Dataflowtask. i denna dataflödesuppgift skapade jag en skriptkomponent (som en källa) och en platt fildestination. Skriptet har en utdatakolumn OutDate av typen DT_DbTimeStamp Inuti skriptet använde jag följande kod:

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

Först slingrar jag över all kulturinformation och jag får alla datetime-format som är relaterade till det och slingrar över dem. Sedan försöker jag konvertera datumet dtDate deklareras till en formaterad sträng och tilldela den till kolumnen Utdata.

Så om tilldelning av strängvärde med specificerat format till DT_DBTIMESTAMP utdatakolumn accepteras betyder det att formatet implicit konverteras

Output0Buffer.OutDate = dtDate.ToString(strFormat)

Och här är länken till resultatfilen:

  • Result.txt

SQL Server datetime Implicit Conversion

Det finns två datetime-strängformat som tolkas korrekt med valfri språkinställning.

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

Du kan också upprepa samma experiment, men den här gången genom att skapa ett SqlCommand och kör det:

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

sqlCmd.ExecuteReader()

På så sätt kan du om sqlcmd ger ett undantag betyder det att formatet inte kan konverteras.




  1. 5 MySql användbara frågor under projektutveckling

  2. Varför går SQL-id-sekvenser ur synk (särskilt med Postgres)?

  3. Vad är MySQL-radordning för SELECT * FROM table_name;?

  4. Hur undkommer jag ett enstaka citat i SQL Server?