2013-03-26 3 views
1

У меня есть таблица счетов, в которой я храню счета-фактуры для данных диапазонов данных (например, счет-фактура 1 для даты между 2012-01-01-2012-01-31). Теперь это возможно за несколько дней, чтобы не иметь счета связаны, так что вы быЗаполнение пробелов между диапазонами данных в Mysql

> ID | START_DATE | END_DATE 
> ---------------------------- 
> 1 | 2012-01-01 | 2012-01-31 
> 2 | 2012-02-05 | 2012-02-28 

Так что в этом случае 5 дней с февраля не будет иметь счет, связанный с ними. В настоящее время я хочу оценить затраты, поэтому мне нужно как-то «получить» эти недостающие диапазоны данных.

Я видел несколько ответов на SO с похожими проблемами, но большинство из них полагаются на дополнительную таблицу календаря, которую я не могу создать.

Есть ли какое-либо другое решение SQL, или было бы лучше фактически получать счета, а затем вычислять пробелы в моем приложении?

ответ

0

Если набор данных не имеет пересекающиеся даты, одно решение использовать запрос, как это, который извлекает все недостающие диапазоны:

select 
    r1.END_DATE + INTERVAL 1 DAY d1, MIN(r2.START_DATE) - INTERVAL 1 DAY d2 
from 
    ranges r1 INNER JOIN ranges r2 
    ON r1.END_DATE <= r2.START_DATE 
group by 
    r1.END_DATE 
having 
    DATEDIFF(MIN(r2.START_DATE), r1.END_DATE) > 1 

Пожалуйста, см скрипку here.

+0

это сделал, спасибо! – MichelReap

+0

Я знаю, что это не было частью вопроса, хотя для будущих читателей это не работает, если набор данных имеет перекрывающиеся даты. См. [This fiddle] (http://sqlfiddle.com/#!2/4ddcf/1), где я добавил диапазон '2012-03-14' в' 2012-03-17', и он неправильно добавляет 18 20-е место в промежутке, где строка №5 противоречит тому, что с 16-го по 19-е место охвачено. – Turnerj

+1

@Turnerj благодарит за ваш комментарий, вы правы, мне нужно будет обновить свой ответ, лучше указать, что он не будет работать, если набор данных имеет перекрывающиеся даты – fthiella

Смежные вопросы