sql >> Databáze >  >> RDS >> Sqlserver

Zdrojový formát SSIS Implicitní převod pro datum a čas

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.




  1. Kompromisy v Hot Standby Deployments

  2. Příklady SQL Server PRO JSON PATH (T-SQL)

  3. Barman Cloud – Část 2:Cloud Backup

  4. Oracle SQL Developer:Selhání – Test se nezdařil:Síťový adaptér nemohl navázat spojení?