phpbar.de logo

Mailinglisten-Archive

[php] MySQL: Luecken in Intervallen finden

[php] MySQL: Luecken in Intervallen finden

Jens Vonderheide php_(at)_phpcenter.de
Wed, 11 Sep 2002 17:28:23 +0200


Eureka!

Nochmals vielen Dank an Wolfgang Hauck, seine Lösung war es schon fast.
Wenn ich nicht kaputte Daten zum Testen genommen hätte (end < start,
autsch), hätte ich das schneller gesehen...

Für das Archiv:

# Testdaten erzeugen
CREATE TABLE spans (
   id_common int unsigned not null,
   start     date not null,
   end       date not null
);
INSERT INTO spans VALUES (1, '2000-01-01', '2000-07-31');
INSERT INTO spans VALUES (1, '2000-07-31', '2000-09-30');
INSERT INTO spans VALUES (1, '2001-01-01', '2001-12-31');

# Für jedes Endedatum das nächste (kleinste) Startdatum suchen
CREATE TEMPORARY TABLE t (
   id_common int unsigned not null,
   start     date not null,
   minend    date not null
) TYPE=HEAP;

INSERT INTO t SELECT
   a.id_common,
   a.end,
   MIN(b.start)
FROM
   spans AS a
LEFT JOIN spans AS b ON
   a.id_common = b.id_common
WHERE
   a.end <= b.start
GROUP BY
   a.id_common,
   a.end;

# Alle Einträge rausfiltern, zwischen denen keine Lücke ist (d.h. start =
minend)
SELECT
   id_common,
   start,
   minend
FROM
   t
WHERE
   start != minend;

Das ganze klappt auch mit sich überschneidenden Intervallen. Ich muss noch
ein paar DATE_ADD einbauen, da das nächste Intervall auch einen Tag nach dem
Ende des letzten beginnen darf.

Jens


php::bar PHP Wiki   -   Listenarchive