2012-03-20 1 views
3

У меня есть таблица mysql со строками: ID, имя, startDate, endDate.Получение отсутствующих дат из таблицы sql

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

говорит, что я это дата вставлена:

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 целых записей таблицы?

Спасибо!

+0

Я думаю, что вы должны быть более тщательно в ваших объяснений. Например, если у вас есть - 2012-01-03 -> 2012-01-05 и 2012-01-06 -> 2-12-01-09, нужно ли это отображать? Под этим я подразумеваю пробел bewteen 2012-01-05 и 2012-01-06. – nnichols

+0

он должен предупредить, что один день отсутствует, endDate одной записи должен быть первым из – GabrielCol

ответ

1
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

Это, похоже, сработает, проверит больше и сообщит вам об этом. БОЛЬШОЕ СПАСИБО!!! – GabrielCol

0

Да, это можно сделать без серфинга всей таблицы с помощью 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 
); 

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

+0

, можете ли вы уточнить? Я получил две строки: startDate и endDate, но вы использовали строку с именем date во всем мире. спасибо – GabrielCol

+0

Упс - здесь какая-то путаница. не правильно прочитал вопрос и предположил, что данные были нормализованы. Я поправлю запрос - BTW - это столбцы или атрибуты, а не строки. – symcbean

0

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

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; 
+1

Вы не можете предположить, что оба идентификатора и диапазоны дат являются последовательными, особенно если учесть, что для исправления ситуации потребуется вставка со значениями, охватывающими пробел. Вновь вставленная строка не будет находиться в последовательности. – nnichols

+0

, сосредоточив внимание на том, чтобы избежать подзапроса, я пропустил эту деталь. Я проголосую за ваш комментарий. Спасибо, что поделились своим наблюдением. – kasavbere