Получение недостающих дат из таблицы SQL - PullRequest
3 голосов
/ 21 марта 2012

У меня есть таблица mysql со строками: ID, имя, startDate, endDate.

Как правило, даты должны быть последовательными, и я хочу предупредить пользователя, если интервал отсутствует.

Сказать, что у меня есть эти даты вставлены:

2012-03-25 -> 2012-03-29
2012-04-02 -> 2012-04-05

Я хочу показать сообщение типа

"No dates found from 2012-03-29 to 2012-04-02. Please insert data for this interval"

Можно ли это сделать без просмотра php всей таблицы?

Спасибо!

Ответы [ 3 ]

1 голос
/ 21 марта 2012
SELECT t1.endDate AS gapStart, (SELECT MIN(t3.startDate) FROM `table` t3 WHERE t3.startDate > t1.endDate) AS gapEnd
FROM `table` t1
LEFT JOIN `table` t2
    ON t1.endDate = t2.startDate
WHERE t2.startDate IS NULL
0 голосов
/ 21 марта 2012

Это работает.Я включил код для создания таблицы и вставки данных для целей тестирования.

 create table dates(
id int(11) not null auto_increment,
name varchar(16) not null,
startDate date,
endDate date,
primary key(id)
);

insert into dates (name,startDate,endDate) 
values('personA', '2012-03-25', '2012-03-29'),
      ('PersonB','2012-04-02', '2012-04-05');

Итак, вот запрос:

 select d1.endDate,d2.startDate 
 from dates d1, dates d2 
 where (d1.id+1) =d2.id and d1.endDate < d2.startDate;
0 голосов
/ 21 марта 2012

Да, это можно сделать, не просматривая всю таблицу, используя PHP, вместо этого вы должны просматривать всю таблицу, используя mysql.Грубое решение будет следующим:

SELECT a.enddate AS start_of_gap, 
(SELECT MIN(c.startdate)
 FROM yourtable c
 WHERE c.startdate>a.enddate) AS end_of_gap
FROM yourtable a
WHERE NOT EXISTS (
   SELECT 1
   FROM yourtable b
   WHERE b.startdate=a.enddate + INTERVAL 1 DAY
);

Я ожидаю, что если я подумаю над этим еще немного, найдется более эффективный (но, вероятно, менее очевидный) метод.

...