MySQL: Auswertung nach Tag

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL: Auswertung nach Tag

    Hallo,

    ich versuche verzweifelt die Lösung für das folgende Problem zu finden:

    Relevant aus einer Tabelle sind die zwei Spalten
    - Start (datetime)
    - Ende (datetime)

    Als Beispiel nehmen wir folgende Einträge an:

    Start | Ende
    2021-04-12 12:00:00 | 2021-04-12 13:00:00
    2021-04-12 22:00:00 | 2021-04-13 02:00:00

    Nun möchte ich wissen wie lange war etwas an einem Tag eingeschaltet, also
    2021-04-12 10800 (sek / = 3 Std.)
    2021-04-13 7200 (sek / = 2 Std.)

    Alles was ich bis jetzt versucht habe, berücksichtigt leider nicht den Datumsübergang.

    Bin sehr dankbar für Denkanstöße.

    mfg

    Homer80

  • #2
    Code:
    SET @d = DATE_SUB((SELECT DATE(MIN(Start)) FROM test), INTERVAL 1 DAY);
    
    SELECT
        @d := DATE_ADD(@d, INTERVAL 1 DAY) AS day,
        (SELECT
            SUM(TIMESTAMPDIFF(
                HOUR,
                GREATEST(@d, LEAST(DATE_ADD(@d, INTERVAL 1 DAY), Start)),
                GREATEST(@d, LEAST(DATE_ADD(@d, INTERVAL 1 DAY), Ende))
            ))
        FROM
            test) AS hours
    FROM
        test
    WHERE
        @d <= (SELECT MAX(Ende) FROM test);
    Code:
    MariaDB [test]> CREATE TABLE test (
        ->   Start datetime NOT NULL,
        ->   Ende datetime NOT NULL
        -> ) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.028 sec)
    
    MariaDB [test]> INSERT INTO test (Start, Ende) VALUES
        -> ('2021-04-12 12:00:00', '2021-04-12 13:00:00'),
        -> ('2021-04-12 22:00:00', '2021-04-13 02:00:00');
    Query OK, 2 rows affected (0.004 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    MariaDB [test]> SET @d = DATE_SUB((SELECT DATE(MIN(Start)) FROM test), INTERVAL 1 DAY);
    Query OK, 0 rows affected (0.000 sec)
    
    MariaDB [test]> SELECT
        ->     @d := DATE_ADD(@d, INTERVAL 1 DAY) AS day,
        ->     (SELECT
        ->         SUM(TIMESTAMPDIFF(
        ->             HOUR,
        ->             GREATEST(@d, LEAST(DATE_ADD(@d, INTERVAL 1 DAY), Start)),
        ->             GREATEST(@d, LEAST(DATE_ADD(@d, INTERVAL 1 DAY), Ende))
        ->         ))
        ->     FROM
        ->         test) AS hours
        -> FROM
        ->     test
        -> WHERE
        ->     @d <= (SELECT MAX(Ende) FROM test);
    +------------+-------+
    | day        | hours |
    +------------+-------+
    | 2021-04-12 |     3 |
    | 2021-04-13 |     2 |
    +------------+-------+
    2 rows in set (0.002 sec)
    Zuletzt geändert von h3ll; 24.04.2021, 15:03.

    Kommentar


    • #3
      Vielen lieben Dank. Das bringt mich schon mal ein ganzes Stück weiter.
      Müssen die Benutzdefinierten Variablen eigentlich "zurückgesetzt" werden?



      Habe mir die erstellten Abfragen in eine Prozedur gepackt und gelegentlich beendet sich jetzt der MySQL Dienst. Zum Glück nur auf meinem Testsystem. Muss mal schauen ob ich den Fehler näher eingrenzen kann.


      mfg


      Homer80

      Kommentar

      Lädt...
      X