none
Transact SQL: SELECT mit Datumskonvertierung RRS feed

  • Frage

  • Hallo liebe Forenmitglieder,

    ich habe eine SQL Server-Datenbank mit sinngemäß folgenden zwei Tabellen:

    Tabelle A

    field    nchar(40)

    anzahl    int

    Tabelle B

    add_datum    datetime

    bezeichnung    nchar(100)

    Das Feld 'field' in Tabelle A entspricht im Prinzip dem Feld 'add_datum' in Tabelle B. Ich muss eine SQL-Anweisung finden, die mir inhaltlich zum Datenatz aus Tabelle A die Bezeichnung aus Tabelle B hinzuliest. Wären die Datentypen der Felder 'field' und 'add_datum' gleich, wäre das natürlich kein Problem.

    Zur Verdeutlichung des Problems hier zwei Datensätze aus den beiden Tabellen:

    Tabelle A: '2007110116330800', 120

    Tabelle B: '2007-11-01 16:33:08.000', 'Bezeichnung'

    Die Anweisung SELECT field, anzahl, bezeichnung FROM A INNER JOIN B ON field = add_datum führt zu der Fehlermeldung '

    Fehler beim Konvertieren einer Zeichenfolge in ein Datum und/oder eine Uhrzeit.'

    Hat jemand eine Idee, wie ich das Problem lösen kann?

    Vielen Dank,

    Sönke Schreiber

    Freitag, 3. Juni 2016 12:28

Antworten

Alle Antworten

  • Hallo Sönke,

    CONVERT ist dein Freund, s. hier https://msdn.microsoft.com/de-de/library/ms187928(v=sql.120).aspx also

    SELECT ... ON CONVERT(DATETIME,A.Field,121)=add_datum

    sollte zum Ziel führen

    Grüße

    Freitag, 3. Juni 2016 12:49
  • Hallo Sönke,

    "field" enspricht weder im Prinzip noch sonst auf irgendeine Art dem Feld "add_datum". Weder vom Datentyp noch vom Inhalt her. Da das Format auch nichts entspricht, was man als Datum interpretieren könnte, kommt der Fehler völlig zurecht.

    Speicher die Inhalte im richtigen Format bzw. versuch, die Werte mit Stringoperationen zu zerschneiden und in ein konvertierfähiges Format umzuwandeln.

    @Tu Dang: Das klappt nicht, da der String wie angegeben nicht umgewandelt werden kann.

    SELECT CONVERT( datetime, '2007110116330800' )


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 3. Juni 2016 12:50
    Moderator
  • Hallo Stefan,

    Danke für Deine Antwort. Mein Problem ist, dass ich diese Tabellen in keinster Weise verändern kann. Weder bzgl. Datentyp noch bzgl. Inhalt.

    Das Convert geht so tatsächlich nicht, und dass dies zurecht so ist, bezweifle ich nicht.

    Ich suche nach einem Workaround. Dieser wird sich nun um Stringoperationen drehen.

    Gruß,

    Sönke

    Freitag, 3. Juni 2016 13:13
  • Hallo Sönke,

    ich würde mir eine Funktion schreiben, die den bisherigen Wert in das Format

      yyyy-mm-ddThh:nn:ss.mmm

    umwandelt. Wie die Umwandlung aussehen könnte, siehst Du hier:

    DECLARE @Field  nchar( 40 ) = '2007110116330800';
    DECLARE @String nvarchar( 40 );
    
    SELECT @String =
           SUBSTRING( @Field, 1, 4 ) +
           '-' + 
           SUBSTRING( @Field, 5, 2 ) +
           '-' + 
           SUBSTRING( @Field, 7, 2 ) +
           'T' + 
           SUBSTRING( @Field, 9, 2 ) +
           ':' + 
           SUBSTRING( @Field, 11, 2 ) +
           ':' + 
           SUBSTRING( @Field, 13, 2 ) +
           '.' + 
           SUBSTRING( @Field, 15, 3 )
    
    SELECT CONVERT( datetime, @String )
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 3. Juni 2016 14:20
    Moderator
  • Hallo zusammen,

    ab SQL Server 2012 gibt es Funktionen wie DATETIME2FROMPARTS, mit der man via Substring ein richtiges Datum daraus basteln kann, für mehr siehe Datums- und Uhrzeitdatentypen und zugehörige Funktionen (Transact-SQL).

    Gruß Elmar

    Freitag, 3. Juni 2016 14:27
    Beantworter