Ausgabe eines Query anders als erwartet

Hallo,

ich habe mir hier nicht das komplette Problem durchgelesen. Wenn es jedoch nur ein Problem ist an die Zeiten der letzen Zeile zu kommen kannst du mit Variablen arbeiten.

...

Noch kurz eine Anmerkung:
Window Funktionen sind in MariaDB 10.2 vorhanden und diese ist einfach mit MySQL zu tauschen und auch kompatibel.


Gruss

Bernd
Hallo Bernd, habe vor kurzem erst bemerkt, dass Xampp ja MariaDB benutzt, allerdings sind diese Window-Funktionen erst ab einer Version mit drin, die Xampp noch nicht unterstützt. So habe ich jetzt erstmal damit Zeit verbracht, meinem Xampp eine neuere MariaDB zu spendieren.

Mit diesen Window-Funktionen muss ich mich erstmal auseinandersetzen, ist ja komplett neu für mich.

Mein Problem von ganz oben ist allerdings folgendes.

Ich speichere die Schichtzeit unserer Fahrer in der Datenbank (lkw_id, beginn, ende) und möchte die Ruhepausen errechnen. Soll heißen, ich nehme die ende-Zeit von dem einem Eintrag und die beginn-Zeit des nächsten Eintrag mit gleicher lkw_id und bekomme die Ruhepause.

Ich habe oben schon einen Query stehen, der das macht, allerdings nur solange es nur eine lkw_id in der Tabelle schichten steht. Kommt ein zweiter LKW hinzu, passen einige Werte wieder nicht.
Ich habe schon einiges probiert, komme aber nicht zu einem Ergebnis.
 
Werbung:
Wie sieht es dann hiermit aus:

Code:
SELECT s1.lkw_id , s1.beginn, s1.ende ,
    IF( timediff(s2.beginn,s1.ende) IS NULL
    , CONCAT('Ende der Schicht LKW ID : ',s1.lkw_id)
    , timediff(s2.beginn,s1.ende)) AS Pause
FROM (
        SELECT @nr1:=@nr1+1 AS row_nr,s.*
        FROM schichten s
        CROSS JOIN (SELECT @nr1:=0) AS init
        ORDER BY lkw_id,beginn
        ) AS s1
LEFT JOIN (
        SELECT @nr2:=@nr2+1 AS row_nr,s.*
        FROM schichten s
        CROSS JOIN (SELECT @nr2:=0) AS init
        ORDER BY lkw_id,beginn
        ) AS s2 ON s1.lkw_id = s2.lkw_id AND s2.row_nr = s1.row_nr+1;

Beispiel:

Code:
mysql> select * from schichten;
+------------+--------+---------------------+---------------------+
| schicht_id | lkw_id | beginn              | ende                |
+------------+--------+---------------------+---------------------+
|          1 |     11 | 2016-01-01 10:00:00 | 2016-01-01 16:00:00 |
|          2 |     12 | 2016-01-02 08:00:00 | 2016-01-02 14:00:00 |
|          3 |     11 | 2016-01-03 09:00:00 | 2016-01-03 10:00:00 |
|          4 |     12 | 2016-01-02 16:00:00 | 2016-01-02 21:00:00 |
|          5 |     12 | 2016-01-02 21:45:00 | 2016-01-02 23:30:00 |
|          6 |     12 | 2016-01-03 04:00:00 | 2016-01-03 06:00:00 |
|          7 |     11 | 2016-01-03 12:00:00 | 2016-01-03 16:15:00 |
+------------+--------+---------------------+---------------------+
7 rows in set (0,01 sec)

mysql> SELECT s1.lkw_id , s1.beginn, s1.ende ,
    ->     IF( timediff(s2.beginn,s1.ende) IS NULL
    ->     , CONCAT('Ende der Schicht LKW ID : ',s1.lkw_id)
    ->     , timediff(s2.beginn,s1.ende)) AS Pause
    -> FROM (
    ->         SELECT @nr1:=@nr1+1 AS row_nr,s.*
    ->         FROM schichten s
    ->         CROSS JOIN (SELECT @nr1:=0) AS init
    ->         ORDER BY lkw_id,beginn
    ->         ) AS s1
    -> LEFT JOIN (
    ->         SELECT @nr2:=@nr2+1 AS row_nr,s.*
    ->         FROM schichten s
    ->         CROSS JOIN (SELECT @nr2:=0) AS init
    ->         ORDER BY lkw_id,beginn
    ->         ) AS s2 ON s1.lkw_id = s2.lkw_id AND s2.row_nr = s1.row_nr+1;
+--------+---------------------+---------------------+------------------------------+
| lkw_id | beginn              | ende                | Pause                        |
+--------+---------------------+---------------------+------------------------------+
|     11 | 2016-01-01 10:00:00 | 2016-01-01 16:00:00 | 41:00:00                     |
|     11 | 2016-01-03 09:00:00 | 2016-01-03 10:00:00 | 02:00:00                     |
|     11 | 2016-01-03 12:00:00 | 2016-01-03 16:15:00 | Ende der Schicht LKW ID : 11 |
|     12 | 2016-01-02 08:00:00 | 2016-01-02 14:00:00 | 02:00:00                     |
|     12 | 2016-01-02 16:00:00 | 2016-01-02 21:00:00 | 00:45:00                     |
|     12 | 2016-01-02 21:45:00 | 2016-01-02 23:30:00 | 04:30:00                     |
|     12 | 2016-01-03 04:00:00 | 2016-01-03 06:00:00 | Ende der Schicht LKW ID : 12 |
+--------+---------------------+---------------------+------------------------------+
7 rows in set (0,01 sec)

mysql>
 
Werbung:
Zurück
Oben