Announcement

Collapse
No announcement yet.

Update Befehl für das Füllen eines leeren Tabellenfeldes mit Datum- und Uhrzeitwert

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Update Befehl für das Füllen eines leeren Tabellenfeldes mit Datum- und Uhrzeitwert

    Hallo zusammen,

    ich stehe vor folgendem Problem.

    Ich habe in einer MS-SQL DB eine Tabelle, in der es ein Schlüsselfeld gibt (ID) ein datetime Feld bei dem nur die Datumwerte gefüllt sind, ein varchar(5) Feld, in dem gültige Uhrzeiten im Format [hh:mm] eingetragen sind und ein leeres datetime Feld, in dem das Datum aus dem Datumsfeld und die Uhrzeit aus dem varchar Feld (die Uhrzeit) per update Befehl eingetragen werden sollen.

    Hier einige Datensätze aus der ursprünglichen Tabelle:

    ID Datum Uhrzeit Ergebnis
    1 01.04.2015 14:00 NULL
    2 15.06.2015 13:33 NULL
    3 16.07.2015 15:55 NULL
    4 22.08.2015 17:33 NULL
    So soll das fertige Ergebnis aussehen:

    ID Datum Uhrzeit Ergebnis
    1 01.04.2015 14:00 01.04.2015 14:00
    2 15.06.2015 13:33 15.06.2015 13:33
    3 16.07.2015 15:55 16.07.2015 15:55
    4 22.08.2015 17:33 22.08.2015 17:33

    Ich hatte das versucht über den folgende Weg:

    update Tabellenname
    set Ergebnis =
    ( cast(convert(varchar(19),Datum,104) + ' ' + Uhrzeit + ':00' as datetime)
    where ID in
    (select ID
    from Tabellenname
    where Datum is not NULL) )

    where ID in
    (select ID
    from Tabellenname
    where Datum is not NULL)

    Leider bekomme ich aus dem SQL Server Management Studio immer folgende Fehlermeldung zurück:
    "Meldung 512, Ebene 16, Status 1, Zeile 1 Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird."

    Hat hier jemand eine einfache Lösung des Problems?
    Vielen Dank.
    Zuletzt editiert von HPeters; 20.10.2016, 05:56.

  • #2
    Hallo,

    in diesem Fall reicht in der WHERE - Bedingung:

    Code:
    ...
    WHERE Ergebnis IS NULL
    Ohne den "Umweg" über den Primärschlüssel.

    Viele Grüße
    Tino
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Hallo tinof,

      meinst Du das in der Art und Weise?


      update Tabellenname
      set Ergebnis = ( cast(convert(varchar(19),Datum,104) + ' ' + Uhrzeit + ':00' as datetime) )

      where ID in
      (select ID
      from Tabellenname
      where Datum is not NULL)

      Comment


      • #4
        So war es gemeint:
        [highlight=sql]update Tabellenname
        set Ergebnis = ( cast(convert(varchar(19),Datum,104) + ' ' + Uhrzeit + ':00' as datetime) )
        where Datum is not NULL;[/highlight]

        Ich kenne mich nicht gut mit MSSQL aus, aber die Datumsumwandlung sieht nicht korrekt aus, vielleicht hilft das hier weiter http://www.sqlines.com/oracle-to-sql-server/to_date .

        Comment


        • #5
          Ok. Also noch einfacher als ich dachte. Hab ich was dazugelernt.

          Mein Script (das von 07:11) hatte aber auch funktioniert. Vielen Dank.

          Ach ja, die Datumsumwandlung funktioniert auf nem MS-SQL Server 2012 so.
          Zuletzt editiert von HPeters; 20.10.2016, 10:06.

          Comment


          • #6
            @FlexGer
            Ja, danke für die Ergänzung!

            Mit einer kleinen Änderung:

            [highlight=sql]update Tabellenname
            set Ergebnis = ( cast(convert(varchar(19),Datum,104) + ' ' + Uhrzeit + ':00' as datetime) )
            where Ergebnis is NULL;[/highlight]

            Das mit dem Datum könnte tatsächlich kritisch werden.

            GGf. mit

            [highlight=sql]SET Dateformat dmy[/highlight]

            Auf "Tag / Monat / Jahr" = deutsch (104) setzen.

            Viel Erfolg
            Tino
            Ich habs gleich!
            ... sagte der Programmierer.

            Comment


            • #7
              Ich würde jegliche Lokalisierungsproblematik ausschließen wollen. Wenn Datum tatsächlich ein Datetime ist würde ich die Uhrzeit hinzuaddieren. Dann muß man nur das Uhrzeit Format parsen und hat etwas das unabhängig von der ~Kultur~ der Beteiligten Systeme funktioniert.

              [HIGHLIGHT=SQL]
              UPDATE Tabellenname
              SET Ergebnis = DATEADD(minute, CAST(SUBSTRING(Uhrzeit, 1, 2) as int) * 60 + CAST(SUBSTRING(Uhrzeit, 4, 2) as int), Datum)
              WHERE Ergebnis IS NULL;[/HIGHLIGHT]

              Comment

              Working...
              X