Announcement

Collapse
No announcement yet.

Abfrage von MySQL zu MS SQL übersetzen

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

  • Abfrage von MySQL zu MS SQL übersetzen

    Hallo zusammen,

    folgendes Problem: eine interene, selbst entwickelte Software lief bislang mit einer MySQL Datenbank. Diese Software soll nun nicht mehr nur intern verwendet werden und eine der Grundvoraussetzung dafür ist, dass als Datenbanksystem fortan eine MS SQL Datenbank benutzt wird. Dies bedeutet, dass einige Queries in der Software umgeschrieben werden müssen. Bis lang war das für mich alles machbar, jetzt hänge ich aber an einer für mich ziemlich komplexen Abfrage. Orignal in MySQL sah diese so aus:

    Code:
    SELECT tdry FROM avlaptimes WHERE serid = 1 and trackid = 7 INTO @avdrytime;
    SELECT twet FROM avlaptimes WHERE serid = 1 and trackid = 7 INTO @avwettime;
    SELECT CAST(startt AS TIME) FROM sessions WHERE sessid = 505 INTO @startt;
    SELECT laptime_offset_out FROM events WHERE eventid = 84 INTO @offset_out;
    SELECT laptime_offset_in FROM events WHERE eventid = 84 INTO @offset_in;
    
    SELECT CAST(ADDTIME(ADDTIME(@startt, runtime_sum),@prept_sum:=ADDTIME(@prept_sum,SEC_TO_TIME((prept*60) + prept_s))) AS TIME) AS StartOfRun,CAST(ADDTIME(ADDTIME(@startt, CAST(@runtime_sum:= ADDTIME(@runtime_sum,CAST(@runtime:=SEC_TO_TIME(laps*IF(wet = 0, @avtime:=@avdrytime,@avtime:=@avwettime)+@offset_out+@offset_in) AS TIME)) AS TIME)),@prept_sum) AS TIME) AS EndOfRun,pos, t.setname, wet, fuel, item, notes, done, rprunid, r.setid, typeid FROM rp_runs r JOIN (SELECT runtime_sum := cast('00:00:00' AS TIME)) B JOIN (SELECT @prept_sum := cast('00:00:00' as TIME)) C LEFT JOIN tyresets t on r.setid = t.setid WHERE sessid = 505 AND r.chid = 16 ORDER BY pos
    Zuerst werden also die Variablen @avdrytime, @avwettime, usw. gefüllt. Diese werden im letzten SELECT statement benutzt. Innerhalb diese Statements werden Variablenwerte auch wieder überschrieben, um damit weiterzurechnen und so Zeiten für jede Eregebniszeile aufzusummieren. Abgesehen von den unterschiedlichen DATE und TIME-functions in MS SQL sind hauptsächlich das Zuweisen von neuen Variablenwerten innerhalb von anderen Funktion und das IF statement innerhalb einer Rechenoperation das Problem. Mein aktueller Query für MS SQL, wenn auch nicht vollständig umgesetzt sieht wie folgt aus:

    Code:
    DECLARE @avdrytime INT;
    DECLARE @avwettime INT;
    DECLARE @avtime INT;
    DECLARE @prept_sum TIME;
    DECLARE runtime TIME;
    DECLARE runtime_sum TIME;
    DECLARE @offset_out INT;
    DECLARE @offset_in INT;
    DECLARE @startt TIME;
    
    SELECT @avdrytime = tdry FROM avlaptimes WHERE serid = 1 AND trackid = 7;
    SELECT @avwettime = twet FROM avlaptimes WHERE serid = 1 AND trackid = 7;
    SELECT @startt = CAST(startt AS TIME) FROM sessions WHERE sessid = 505;
    SELECT @offset_in = laptime_offset_in FROM events WHERE eventid = 84;
    SELECT @offset_out = laptime_offset_out FROM events WHERE eventid = 84;
    
    SELECT CAST(DATEADD(second, DATEPART(second, DATEADD(second, DATEPART(second,@startt), runtime_sum)), SELECT @prept_sum = DATEADD(second, DATEPART(second, DATEADD(second, (prept*60) + prept_s, 0)), @prept_sum)) AS TIME) AS StartOfRun,CAST(ADDTIME(ADDTIME(@startt, CAST(@runtime_sum= ADDTIME(@runtime_sum,CAST(@runtime:=SEC_TO_TIME(laps*(IF (wet = 0) SELECT @avtime=@avdrytime ELSE SELECT @avtime=@avdrytime)+@offset_out+@offset_in) AS TIME)) AS TIME)),@prept_sum) AS TIME) AS EndOfRun,pos, t.setname, wet, fuel, item, notes, done, rprunid, r.setid, typeid FROM rp_runs r JOIN (SELECT runtime_sum = cast('00:00:00' AS TIME)) B JOIN (SELECT @prept_sum = cast('00:00:00' AS TIME)) C LEFT JOIN tyresets t on r.setid = t.setid WHERE sessid = 505 AND r.chid = 16 ORDER BY pos
    Da bin ich dann mit meinem Latein auch am Ende und habe leider keinen blassen Schimmer wie ich dieses Statement von MySQL in MS SQL übersetzten kann. Vielleicht kann einer von euch helfen.

    Besten Dank und viele Grüße

    Andy

  • #2
    Wie wäre es, wenn Du die Abfragen mal durch einen Formatter jagst, damit man sie halbwegs lesen kann?
    Eine Handvoll Beispieldaten mit Wunschergebnis wäre auch nicht verkehrt, müsste ja easy sein, soetwas aus dem laufenden Ausgangssystem rauszuziehen (Daten, nicht Screenshots).

    Comment

    Working...
    X