Если вы не используете 8.0, вы можете создать рабочую таблицу для хранения данных:
CREATE TABLE _gap_cal (
ID int not null,
date_to date not null,
rid int not null auto_increment,
date_from date null,
PRIMARY KEY (ID,rid)
) ENGINE=MYISAM;
Затем заполните данные следующим образом:
INSERT _gap_cal(ID,date_from,date_to,rid)
SELECT ID,COALESCE(date_from,'1900-01-01'),date_to,NULL
FROM your_data_table
ORDER BY ID,date_to;
Для целей тестирования:Я просто вставляю некоторые данные напрямую:
INSERT _gap_cal(ID,date_from,date_to,rid)
VALUES (6545,'1900-01-01','2018-06-01',NULL),
(6545,'2018-09-01','2018-11-01',NULL),
(6545,'2019-01-01','2019-01-01',NULL),
(2421,'2019-04-01','2019-06-01',NULL),
(2421,'2019-07-01','2019-07-01',NULL),
(2421,'2019-09-01','2019-11-01',NULL);
SELECT * FROM _gap_cal;
Следующий запрос даст вам идентификаторы и диапазоны дат с пробелами:
SELECT c.ID,c.date_from,c.date_to, p.date_from as previous_date_from
FROM _gap_cal p
INNER JOIN _gap_cal c
ON p.ID=c.ID
AND p.rid=c.rid-1
AND TIMESTAMPADD(MONTH,1, p.date_to)<>c.date_from
ORDER BY c.ID,c.date_from;