Mailinglisten-Archive |
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