Laufzeitberechnung aus Log-Tabelle

unrealzero_php

Erfahrenes Mitglied
Hallo zusammen

In einer Tabelle tbl_log sind folgende Einträge vorhanden.

01.03.2014 | add
17.03.2014 | remove
19.03.2014 | add
21.03.2014 | remove
15.10.2014 | add

Wie ist es über SQL möglich, die Laufzeit in Tagen herauszufinden?

01.03.2014 bis 17.03.2014 - 17 Tage
19.03.2014 bis 21.03.2014 - 3 Tage
15.10.2014 bis 18.10.2014 - 4 Tage

= 24 Tage
 
Mit einem pragmatischen Ansatz:

SQL:
CREATE TEMPORARY TABLE IF NOT EXISTS tbl_log2 (datum DATE);
INSERT INTO tbl_log2 (datum) SELECT datum from tbl_log;
ALTER TABLE tbl_log ADD COLUMN datum2 DATE;

UPDATE tbl_log SET datum2 = (SELECT t2.datum FROM tbl_log2 t2 WHERE t2.datum > tbl_log.datum ORDER BY t2.datum ASC LIMIT 1);
UPDATE tbl_log SET datum2 = NOW() WHERE datum2 IS NULL;

SELECT DATEDIFF(everysecond.datum2, everysecond.datum) + 1 FROM
(
  SELECT @rownumber := @rownumber + 1 AS rownumber, subselect.* FROM
  (
  SELECT * FROM tbl_log
  ) subselect,
  (
  SELECT @rownumber := 0
  ) r
) AS everysecond
WHERE MOD(everysecond.rownumber, 2) = 1;

ALTER TABLE tbl_log DROP COLUMN datum2;
DROP TABLE tbl_log2;

Die Summen-Berechnung der Einzel-Tage kannst du ja selbst machen ;-) Tipp: SUM() auf die komplette Ergebnissmenge.
 
Annahme ist MySQL. Und auch dass die Tabelle mit einem Add Eintrag beginnt, danach kommt ein remove, dann wieder eine add und endet am Schluss mit remove. (add = ungerade, remove = gerade Zeilen).

SQL:
SELECT
  SUM(z.date_diff) as date_diff_sum
FROM (
  SELECT
  --  a.rank as a_rank, b.rank as b_rank,
  --  a.mydate as a_date, a.action as a_action,
  --  b.mydate as b_date, b.action as b_action
    DATEDIFF(b.mydate, a.mydate) + 1 as date_diff
  FROM
    (SELECT x.* FROM (SELECT mydate, action, @curRank := @curRank + 1 AS rank
    FROM tbl_log, (SELECT @curRank := 0) q
    ORDER BY mydate) x WHERE x.rank%2=1) a
  INNER JOIN
    (SELECT y.* FROM (SELECT mydate, action, @curRank := @curRank + 1 AS rank
    FROM tbl_log, (SELECT @curRank := 0) q
    ORDER BY mydate) y WHERE y.rank%2=0 ) b
  ON
    a.rank + 1 = b.rank
) z;

Gibt aber bestimmt auch bessere Lösungen als so ;)
 

Neue Beiträge

Zurück