план
- перекрестное соединение цифры вместе, чтобы имитировать настольный календарь
- покинул присоединиться календарь DataSource и определить, когда дата нет
- порядок над выше, используя SQL переменные RGN и границы
- агрегат над rgn и граница для получения каждой области
установки
create table somedates
(
id integer primary key not null,
vdate date not null
);
drop view if exists digits_v;
create view digits_v
as
select 0 as n
union all
select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9
;
insert into somedates
(id, vdate)
select @id := @id + 1 as id, date_add('2015-01-01', interval a2.n * 100 + a1.n * 10 + a0.n day) as vdate
from digits_v a2
cross join digits_v a1
cross join digits_v a0
cross join (select @id := 0) params
where date_add('2015-01-01', interval a2.n * 100 + a1.n * 10 + a0.n day) <= date('2015-03-03')
and date_add('2015-01-01', interval a2.n * 100 + a1.n * 10 + a0.n day) not in
(
'2015-01-05',
'2015-02-06'
)
;
запрос
select rgn, min(boundary) `from`, max(boundary) `to`
from
(
select active.aday, active.present,
@rgn := if(active.present,
if(@boundary := active.aday, @rgn, @rgn),
if(@boundary := null, @rgn + 1, @rgn + 1)) as rgn,
@boundary as boundary
from
(
select date_add('2015-01-01', interval a2.n * 100 + a1.n * 10 + a0.n day) as aday,
case when sd.id is not null then true
else false
end as present
from digits_v a2
cross join digits_v a1
cross join digits_v a0
left join somedates sd
on sd.vdate = date_add('2015-01-01', interval a2.n * 100 + a1.n * 10 + a0.n day)
where date_add('2015-01-01', interval a2.n * 100 + a1.n * 10 + a0.n day) <= date('2015-03-03')
and date_add('2015-01-01', interval a2.n * 100 + a1.n * 10 + a0.n day) >= date('2015-01-01')
) active
cross join (select @rgn := 0, @boundary := date('2015-01-01')) params
order by active.aday
) boundaries
group by rgn
having `from` is not null
;
выход
+-----+------------+------------+
| rgn | from | to |
+-----+------------+------------+
| 0 | 2015-01-01 | 2015-01-04 |
| 1 | 2015-01-06 | 2015-02-05 |
| 2 | 2015-02-07 | 2015-03-03 |
+-----+------------+------------+
sqlfiddle
ссылка
может сделать это двумя способами (в SQL): с помощью таблицы календаря (если у вас есть один) или с использованием дешевого симулятора таблицы календаря с жестко закодированными кросс-соединениями на цифрах. или вы можете сделать это в своем коде приложения – amdixon
, так что нет необходимости непосредственно выполнять работу? – vagelis
не встроенная вещь.пример ниже показывает, как имитировать таблицу календаря для этого – amdixon