En la respuesta que he dado anteriormente aparece el campo AID en la tabla, que incorpore para mis pruebas, este es de tipo AutonumericID para identificar de forma única cada registro y lo utilizo para que los LEFT JOIN no devuelvan el mismo registro que lo esta enlazando.
Como dicho campo no se si esta en los datos originales, esta modificación se puede omitir simplemente comparando con los campos desde y hasta
Aquí esta la SQL sin dicho campo:
Código SQL
[-]-- localiza los principios de bloque independientes
SELECT `ini`.id,
ini.desde,
( --
-- localiza el fin de bloque
-- que sera la fecha mas cercana al inicio de bloque
SELECT min(fin.hasta) AS hasta
FROM `fechas` fin
LEFT JOIN fechas ant
ON ant.id = fin.id
AND NOT (fin.desde = ant.desde AND fin.hasta = ant.hasta)
AND fin.hasta BETWEEN ant.desde AND ant.hasta
WHERE ant.id IS NULL
AND fin.id = ini.id
AND fin.`hasta` >= ini.hasta)
AS hasta
FROM `fechas` ini
LEFT JOIN fechas ant
ON ant.id = ini.id
AND NOT (ini.desde = ant.desde AND ini.hasta = ant.hasta)
AND ini.desde BETWEEN ant.desde AND ant.hasta
WHERE ant.id IS NULL
ORDER BY ini.id, ini.desde;